Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java.security.KeyStore将PKCS7转换为PKCS12_Java_Openssl_X509_Pkcs#7 - Fatal编程技术网

使用java.security.KeyStore将PKCS7转换为PKCS12

使用java.security.KeyStore将PKCS7转换为PKCS12,java,openssl,x509,pkcs#7,Java,Openssl,X509,Pkcs#7,当我尝试在Chrome/Firefox(可能还有其他浏览器)上导入更新的X509证书时,它无法识别我尝试导入的证书使用的是存储在过期用户证书中的具有相同DN的相同私钥。我不知道这是否是所有主流浏览器的证书导入工具实现中的一个bug,但我可以(某种程度上)通过使用openssl工具将我的用户证书存储在一个无私钥的PKCS12文件中来解决这个问题,如下所示 openssl pkcs12-export-in-usercert.pem-nokeys-name“CN:Same name”-out-cert

当我尝试在Chrome/Firefox(可能还有其他浏览器)上导入更新的X509证书时,它无法识别我尝试导入的证书使用的是存储在过期用户证书中的具有相同DN的相同私钥。我不知道这是否是所有主流浏览器的证书导入工具实现中的一个bug,但我可以(某种程度上)通过使用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命令themselve将其转换为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());