22

pem 形式の証明書を Java キー ストアに変換する必要があります。

WindowsサーバーでTomcatでこれを使用するには

私はそれらのファイルを持っています:

  • cert_request.csr

    -----BEGIN CERTIFICATE REQUEST-----
    ...
    -----END CERTIFICATE REQUEST-----
    
  • cert_public_key.pem

    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----
    
  • cert_private_key.pem

    -----BEGIN ENCRYPTED PRIVATE KEY-----
    ...
    -----END ENCRYPTED PRIVATE KEY-----
    
  • 証明書.txt

    contains an 16 digit key
    

私はpemファイルを結合しようとしました(2つのファイルを結合することにより、チェーンされていました)、これをopensslで変換して

  • .der ファイルを作成し、keytool を使用してそれを新しいキーストアにインポートします
  • .p12 と同じ
  • キーストアに直接インポート

私も変えてみました

    -----BEGIN ENCRYPTED PRIVATE KEY-----
    ...
    -----END ENCRYPTED PRIVATE KEY-----

の中へ

    -----BEGIN RSA PRIVATE KEY-----
    ...
    -----END RSA PRIVATE KEY-----

上記の3つの方法を試しました

有効な証明書を取得するにはどうすればよいですか?

編集:

cert_public_key.pem と cert_private_key.pem を cert_comb.pem に結合しました

    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----
    -----BEGIN ENCRYPTED PRIVATE KEY-----
    ...
    -----END ENCRYPTED PRIVATE KEY-----
4

2 に答える 2

42

どのファイルを結合したかは明確ではありませんが、openssl を使用して証明書と秘密鍵を PKCS#12 に結合するとうまくいくはずです。

cat cert_public_key.pem cert_private_key.pem >combined.pem
openssl pkcs12 -export -in combined.pem -out cert.p12

またはその場で(更新:)秘密鍵を最初にする必要があります:

cat cert_private_key.pem cert_public_key.pem | openssl pkcs12 -export -out cert.p12 

証明書にチェーン証明書が必要な場合 -- CSR を送信して証明書を発行したときに CA がこれを通知しているはずです -- 今すぐチェーン証明書も含めるのが最も簡単です。

次に、(1)一部のJava プログラムは、実際には pkcs12 をキーストアとして直接使用できますが、(2) JKS が必要または優先する場合は、keytool を使用します。

keytool -importkeystore -srckeystore cert.p12 -srcstoretype pkcs12 -destkeystore cert.jks 

結果のJKSのエイリアスが気になる場合は、変換後に修正するのが最も簡単です。

また、暗号化された PEM のラベルを変更するだけでは暗号化が解除されません。また、ラベルを汎用 PKCS#8 から RSA に変更しても、実際にはデータが一致するように変更されません (少しだけ異なります)。復号化された秘密鍵を含む別の PEM ファイルが必要な場合:

openssl pkey -in encryptedpk8 -out clearpk8.pem # 1.0.0 up
openssl pkcs8 -in encryptedpk8 -out clearpk8.pem # 1.0.0 up 
openssl pkcs8 -topk8 -nocrypt -in encryptedpk8 -out clearpk8.pem # below 1.0.0
openssl rsa -in encryptedpk8 -out clearrsa.pem
于 2014-03-10T11:15:59.300 に答える
1

最初の質問: 証明書の要求しかありませんか? 実際の証明書ではありませんか?署名する必要があります。自己署名するか、外部の当事者に署名してもらうことができます。

実際の証明書がある場合は、これを使用して秘密鍵ファイルと証明書ファイルを解析できます。

// parse the private key
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); // might not be RSA
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(byteArray);
PrivateKey privateKey = keyFactory.generatePrivate(spec);

// parse cert
CertificateFactory factory = CertificateFactory.getInstance("X.509");
X509Certificate cert = factory.generateCertificate(certInputStream);

// add it to the keystore
store.setKeyEntry(alias, privateKey, password, new X509Certificate[] { cert });

アップデート

私の知る限り、コマンド ラインの keytool は、csr への署名など​​の高度なオプションをサポートしていません。標準の Java でさえこれをサポートしていません。弾む城のような外部ライブラリが必要です。これは簡単ではありません。例えば:

JcaPKCS10CertificationRequest pkcs10 = new JcaPKCS10CertificationRequest(csrBytes);
X509v3CertificateBuilder builder = new JcaX509v3CertificateBuilder(
        issuer,
        generateSerialId(),
        new Date(),
        until,
        subject,
        pkcs10.getPublicKey()
);

X509CertificateHolder holder = builder.build(getContentSigner(privateKey, type));
X509Certificate cert = getCertificate(holder);

...

ContentSigner getContentSigner(PrivateKey privateKey) {
    AsymmetricKeyParameter keyParameter = PrivateKeyFactory.createKey(privateKey.getEncoded());
    AlgorithmIdentifier sigAlgId = new DefaultSignatureAlgorithmIdentifierFinder().find("SHA256WITHRSA"); // or what you want
    AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find(sigAlgId);
    return new BcRSAContentSignerBuilder(sigAlgId, digAlgId).build(keyParameter);
}
于 2014-03-10T09:47:32.687 に答える