当我尝试在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应用程序中使用java.security.KeyStore或类似的库来执行此操作,因为它实际上是我的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());