我得到外部.pem
需要转换为的文件.p12
文件 - 我在此过程中添加用户名和密码。 (我需要这样做才能利用第三方 API。)
Using openssl
,命令是...
openssl pkcs12 -export -in xxxx.pem -inkey xxxx.pem -out xxx.p12 -passout pas:newpassword -name "newname"
我可以从终端会话运行它并且它运行得很好。
然而,我需要经常这样做,并编写了一个 Java 类来处理这个问题以及更多(我的应用程序主要是.jsp
与 Tomcat 和 Apache)。当我尝试使用 Java 运行相同的命令时Runtime.exec
,我收到可怕的“无法写入‘随机状态’”错误(使用 OpenSSL “无法写入‘随机状态’”是什么意思? https://stackoverflow.com/questions/94445/using-openssl-what-does-unable-to-write-random-state-mean ).
我认为不同之处在于,当我从 Java 运行时,用户不是“root”。
那么,是否有更好的方法使用 Java 库将 pem 转换为 .p12,而不是执行命令行程序(即 openssl)?
否则,我想我需要在我的服务器上进行一些配置。我找不到任何.md
文件位于服务器上的任何位置。唯一的openssl.cnf
文件位于一个奇怪的目录中(/etc/pki/tls
)。我需要创建一个新的openssl.cnf
在其他地方归档?
这应该做你想做的事情(使用上面建议的 BouncyCastle PEMReader)——获取 PEM 编码的私钥 + 证书,并输出 PKCS#12 文件。对用于保护私钥的 PKCS12 使用相同的密码。
public static byte[] pemToPKCS12(final String keyFile, final String cerFile, final String password) throws Exception {
// Get the private key
FileReader reader = new FileReader(keyFile);
PEMReader pem = new PEMReader(reader, new PasswordFinder() {
@Override public char[] getPassword() {
return password.toCharArray();
}
});
PrivateKey key = ((KeyPair)pem.readObject()).getPrivate();
pem.close();
reader.close();
// Get the certificate
reader = new FileReader(cerFile);
pem = new PEMReader(reader);
X509Certificate cert = (X509Certificate)pem.readObject();
pem.close();
reader.close();
// Put them into a PKCS12 keystore and write it to a byte[]
ByteArrayOutputStream bos = new ByteArrayOutputStream();
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(null);
ks.setKeyEntry("alias", (Key)key, password.toCharArray(), new java.security.cert.Certificate[]{cert});
ks.store(bos, password.toCharArray());
bos.close();
return bos.toByteArray();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)