3

当我尝试在 Chrome / Firefox(可能还有其他浏览器)上导入更新的 X509 证书时,它无法识别我尝试导入的证书使用存储在具有相同 DN 的到期用户证书中的相同私钥。我不知道这是否是所有主要浏览器的证书导入工具实现的一个错误,但我可以(在某种程度上)通过使用 openssl 工具将我的用户证书存储在一个无私钥的 PKCS12 文件中来解决这个问题,如下所示.

openssl pkcs12 -export -in usercert.pem -nokeys -name "CN: Same Name" -out certonly.p12 (-nokeys 是这里的诀窍)

我不知道为什么会这样,但我可以将 certonly.p12 导入 Chrome / Firefox,它会附加我去年的私钥;尽管它创建了一个单独的证书条目,因此我需要手动删除我的旧证书。

所以,我假设,为了在我的浏览器上更新我的用户证书,我需要将我的证书打包成 PKCS12 格式(带或不带密码)。

现在,我需要使用 java.security.KeyStore 或类似库在我的 Java 应用程序中执行此操作,因为它实际上是我的 Web 应用程序正在生成用户的更新证书。我不想让我们的用户自己使用 openssl 命令将其转换为 pkcs12,然后再导入他们的浏览器。我的应用程序应该自动执行此操作,并向他们提供包含在 PKCS12 文件中的更新证书。

我看过很多地方,但到目前为止,我找不到一个具体的例子来说明如何使用 Java 做到这一点。有谁知道如何在没有私钥的情况下仅使用已颁发的证书(或 pkcs7)输出密码短语少的 PKCS12?

我尝试了类似以下的方法,但没有奏效。

java.security.cert.Certificate[] chain  = CertificateManager.parsePKCS7(renewed_cert_in_pkcs7);
KeyStore p12 = KeyStore.getInstance("PKCS12");
p12.load(null, null);
p12.setKeyEntry("USER Cert 123", null, "".toCharArray(), chain); 
response.setContentType("application/x-pkcs12");
response.setHeader("Content-Disposition", "attachment; filename=user_certificate_only.p12");
p12.store(response.getOutputStream(), "".toCharArray());
4

0 回答 0