使用或不使用OpenSSL将SSL .pem转换为.p12

DrD*_*ave 16 java openssl pkcs#12 pem

我得到.pem需要转换为.p12文件的外部文件- 我在这个过程中添加了用户名和密码.(我需要这样做才能使用第三方API.)

使用openssl,命令是......

openssl pkcs12 -export -in xxxx.pem -inkey xxxx.pem -out xxx.p12 -passout pas:newpassword -name "newname"
Run Code Online (Sandbox Code Playgroud)

我可以从终端会话运行它,它完美地工作.

但是,我需要经常这样做并编写一个Java类来处理这个和更多(我的应用程序主要是.jspTomcat和Apache).当我尝试从Java运行相同的命令时Runtime.exec,我得到了可怕的"无法写入'随机状态'"错误(使用OpenSSL"无法写入'随机状态'"是什么意思?).

我假设不同的是,当我从Java运行时,用户不是"root".

那么,有没有更好的方法使用Java库从pem转换为.p12而不是执行命令行程序(即openssl)?

否则,我想我需要在我的服务器上进行一些配置.我.md在服务器上的任何地方都找不到任何文件.唯一的openssl.cnf文件位于一个奇怪的目录(/etc/pki/tls)中.我是否需要在openssl.cnf其他地方创建新文件?

小智 15

这应该做你想做的事情(使用上面建议的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();
}
Run Code Online (Sandbox Code Playgroud)


Bru*_*der 1

在 Java 中,使用Bouncycastle 但要注意,学习曲线陡峭且文档稀缺。我强烈建议您查看作为源代码分发的一部分提供的示例

从 PemReader 开始。