21

.pemファイルに変換する必要のある外部ファイルを取得し.p12ます-その過程でユーザー名とパスワードを追加します。(サードパーティのAPIを利用するには、これを行う必要があります。)

を使用する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を使用すると、「「ランダム状態」を書き込めない」とはどういう意味ですか?)。

違いは、Javaから実行する場合、ユーザーは「ルート」ではないということだと思います。

それで、コマンドラインプログラム(つまりopenssl)を実行するよりも、Javaライブラリを使用してpemから.p12に変換するより良い方法はありますか?

それ以外の場合は、サーバーでいくつかの構成を行う必要があると思います。.mdサーバー上のどこにもファイルが見つかりません。唯一のopenssl.cnfファイルは奇妙なディレクトリ(/etc/pki/tls)にあります。別の場所に新しいopenssl.cnfファイルを作成する必要がありますか?

4

5 に答える 5

16

これは、(上記で提案したように 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();
}
于 2012-03-23T13:13:59.047 に答える
2

@MugglesMerriweather の回答に基づいて、v1.51 に更新されたバージョンは次のとおりです。

public static byte[] convertPEMToPKCS12(final String keyFile, final String cerFile,
        final String password)
        throws IOException, CertificateException, KeyStoreException, NoSuchAlgorithmException
    {
        // Get the private key
        FileReader reader = new FileReader(keyFile);

        PEMParser pem = new PEMParser(reader);
        PEMKeyPair pemKeyPair = ((PEMKeyPair)pem.readObject());
        JcaPEMKeyConverter jcaPEMKeyConverter = new JcaPEMKeyConverter().setProvider("SC");
        KeyPair keyPair = jcaPEMKeyConverter.getKeyPair(pemKeyPair);

        PrivateKey key = keyPair.getPrivate();

        pem.close();
        reader.close();

        // Get the certificate
        reader = new FileReader(cerFile);
        pem = new PEMParser(reader);

        X509CertificateHolder certHolder = (X509CertificateHolder) pem.readObject();
        java.security.cert.Certificate X509Certificate =
            new JcaX509CertificateConverter().setProvider("SC")
                .getCertificate(certHolder);

        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[]{X509Certificate});
        ks.store(bos, password.toCharArray());
        bos.close();
        return bos.toByteArray();
    }
于 2014-10-31T15:57:24.383 に答える
1

Java では、Bouncycastleを使用します が、学習曲線が急で、ドキュメントが不足していることに注意してください。ソース配布の一部として入手可能な例を確認することを強くお勧めします

PemReader から始めます。

于 2012-03-15T18:01:33.907 に答える