当我尝试在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());