【问题标题】:Java applet can't access Firefox certificate storageJava 小程序无法访问 Firefox 证书存储
【发布时间】:2013-06-12 13:00:51
【问题描述】:

首先,我对 Java 比较陌生(一般编程方面也不是很先进),所以如果我遗漏了一些明显的东西,我提前为浪费您的时间道歉。

我正在尝试创建一个可以访问 Firefox 证书存储的小程序。 搞砸的是,我发誓在我编写并第一次测试这段代码时它是有效的。然后我让电脑休眠,重启后它就不再工作了。

它总是在一开始就失败 - 在KeyStore ks = KeyStore.getInstance("PKCS11");

java.security.KeyStoreException: PKCS11 not found
at java.security.KeyStore.getInstance(Unknown Source)

Caused by: java.security.NoSuchAlgorithmException: PKCS11 KeyStore not available
at sun.security.jca.GetInstance.getInstance(Unknown Source)

我认为代码中没有任何相关内容,但仍然是失败的函数:

/* Process PDF with Firefox */
private static byte[] processFirefox() throws GeneralSecurityException, IOException, DocumentException {
    KeyStore ks = KeyStore.getInstance("PKCS11");
    ks.load(null, "myPassword".toCharArray());
    String alias = (String) ks.aliases().nextElement();
    PrivateKey pk = (PrivateKey) ks.getKey(alias,  null);
    Certificate[] chain = ks.getCertificateChain(alias);
    @SuppressWarnings("unused")
    TSAClient tsaClient = null;
    for (int i = 0; i < chain.length; i++) {
        X509Certificate cert = (X509Certificate)chain[i];
        String tsaUrl = CertificateUtil.getTSAURL(cert);
        if (tsaUrl != null) {
            tsaClient = new TSAClientBouncyCastle(tsaUrl);
            break;
        }
    }
    List<CrlClient> crlList = new ArrayList<CrlClient>();
    crlList.add(new CrlClientOnline(chain));
    return SignPDF.sign(chain, pk, DigestAlgorithms.SHA256, "PKCS11", CryptoStandard.CMS, "A Reason", "A Location", null, null, null, 0);
}

起初我以为是因为我没有指定提供者。然后我做了,没有任何改变。 “有趣”的是我还尝试在 Chrome 中运行相同的小程序,它给了我完全相同的错误。所以我猜小程序要么无法访问/读取 Firefox 的证书存储,要么完全发生了其他事情。 如果我将PKCS11 替换为"Windows-MY", "SunMSCAPI" 并将密码条目替换为null,相同的代码可以完美运行,所以我认为这是PKCS11/Firefox 特有的问题。

所以,我真的可以在这方面使用一些帮助。我已经阅读了 Google 在搜索结果前几页上的每一次点击,但要么我太绿了,他们无法提供帮助,要么他们真的没有足够的帮助。

如果我忘记添加任何可以帮助您帮助我的重要信息,请告诉我。

谢谢! 本

【问题讨论】:

    标签: java firefox applet pkcs#11


    【解决方案1】:

    也许您的安全设置已更改?

    查看以下链接:

    您可以使用简单的 FileReader 访问存储位置吗?

    【讨论】:

    • 我认为可能是这样的。我尝试将 java cpl 中的安全设置降低到最低设置。我尝试调整浏览器安全设置。我尝试了一个签名的未签名的罐子。它只是行不通。如前所述,它确实适用于“Windows-MY”类型和提供者“SunMSCAPI”,所以我猜这与 Java 的访问权限无关。我不太了解使用 FileReader。我可以访问 Firefox 的 cert8.db 文件,但如前所述,小程序在 KeyStore.getInstance 处失败,所以在我从 InputStream 加载 KeyStore 之前。
    • - 如果您只是提取那段代码并将其作为独立的 Java 应用程序运行,它是否有效? - 看看这个:docs.oracle.com/javase/6/docs/technotes/guides/security/… - 你的供应商配置正确吗? - 也许您想尝试动态创建提供程序? String configName = "/opt/bar/cfg/pkcs11.cfg"; Provider p = new sun.security.pkcs11.SunPKCS11(configName);Security.addProvider(p);
    • 我多次重新检查所有内容,修改配置,尝试动态创建提供程序,并将所有内容作为独立应用程序运行。没有蛋糕。我开始认为我想象它第一次工作。我想我会尝试找到另一种方法来做到这一点。 NSS/JSS 似乎是个好主意,尽管我必须弄清楚如何即时获取用户的 Firefox 配置文件目录(FF1.7+ 不再允许网页 AFAIK)。但这完全是另一个问题。
    • @RolandoBenjaminVazFerreira 你找到解决方案了吗?
    • 哦哇,这是一个旧的! @codenamezero - 不,最后,整个想法都被废弃了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 2020-01-24
    • 2011-04-06
    相关资源
    最近更新 更多