JavaキーストアへのPEM証明書チェーンとキーのインポート


29

このトピックに関するリソースはたくさんありますが、この少し特殊なケースをカバーするものは見つかりませんでした。

4つのファイルがあります。

  • privatekey.pem
  • certificate.pem
  • Intermediate_rapidssl.pem
  • ca_geotrust_global.pem

そして、それらを新しいキーストアにインポートしたいと思います。

一部のサイトではDER形式を使用し、それらを1つずつインポートすることを提案していますが、キーが認識されないため失敗しました。

別のサイトは、インポートのために実行する特別な「ImportKey」クラスを提案しましたが、これはチェーンが壊れていることがわかるまで機能しました。つまり、証明書のチェーンの長さは1で、中間とcaを無視します。

PKCS7を推奨するサイトもありますが、そこからチェーンを得ることさえできません。他の人はPKCS12形式を提案していますが、私のテストでは、チェーン全体を取得するのに失敗しました。

アドバイスやヒントは大歓迎です。

回答:


26

これは完璧ではないかもしれませんがkeytool、あなたのシナリオに合わせて変更したことの使用についてのメモがありました。

  1. ルートまたは中間CA証明書を既存のJavaキーストアにインポートします。

    keytool -import -trustcacerts -alias root -file ca_geotrust_global.pem -keystore yourkeystore.jks
    keytool -import -trustcacerts -alias root -file intermediate_rapidssl.pem -keystore yourkeystore.jks 
    
  2. インポートする前に、証明書と秘密キーを1つのファイルに結合します。

    cat certificate.pem privatekey.pem > combined.pem
    

    これにより、以下の形式のようなファイルが作成されます。

    証明書の開始
    ...
    証明書の終了
    RSAプライベートキーの開始
    ...
    RSAプライベートキーの終了

  3. 署名済みのプライマリ証明書とキーを既存のJavaキーストアにインポートします。

    keytool -import -trustcacerts -alias yourdomain -file combined.pem -keystore yourkeystore.jks
    

2
keytoolのどのバージョンを使用すると、このようにチェーンできますか?この構文は、「keytoolのエラー:java.lang.Exceptionを:証明書は、エイリアス<ルート>は既に存在しているインポートされていない」与え-importと-importcert両方とを
ctpenrose

正確に言うのは難しい。しかし、年/月を考えると、Java 6である可能性が高いでしょうか?(マイナーリリースはわかりません。)どのバージョンを使用していますか?エラーは、問題がキーストア自体にある可能性があるようです。(alias <root> already exists)新しい空のキーストアで試すことができますか?
アーロンコプリー

1
Keytoolでは、既存のエイリアス「root」を使用して証明書をインポートできません。しかし、それはタイプミスだったと思います。キーストアが(任意のエイリアスの下で)キーストアで署名者の証明書を見つけると、keytoolが証明書自体のチェーンを作成することに注意してください。Javaツール「Portecle」は、Javaキーストアの管理に便利です。
ホウトマン14

Keytoolはこのように機能せず、説明したようにエイリアスを複数回インポートすることはできません。(そして、はい、私は試しました)。適切に機能するものについては、以下のsenajqeribの回答を参照してください。
スティーブセザー

1
3年前の答えです。状況が変わった可能性は完全にありますが、2013年2月の時点で機能していた(または完璧ではない可能性があると指摘したとおりに機能していた)ことを保証します。
アーロンコプリー

42

all.pemのように、すべての* .pemファイルを1つのpemファイルに連結してから、秘密鍵+ all.pemでp12形式のキーストアを作成します

openssl pkcs12 -export -inkey private.key -in all.pem -name test -out test.p12

次に、p12をjksにエクスポートします

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

ありがとうございました。これが唯一の完全かつ正しい答えです。提案したとおり、証明書を1つのファイルに連結するだけの方がはるかに簡単です。
スティーブセザー

これは私にとってはごlike走のように働いた!これらの手順を使用して、nodejs-self-signed-certificate-exampleリポジトリで使用されるキーのチェーンをJavaベースのTLSサーバーと通信するように変換しました。感謝万円!
ガルダーザマレーニョ

これは正解です。
sfThomas

8

keytoolは、上記で提案したように、単一の(結合された)ファイルから証明書+秘密鍵をインポートする方法を提供しません。正常に実行されますが、証明書のみがインポートされ、秘密キーは無視されます。確認するには、keytool -list -v -keystore yourkeystore.jksyourdomainエントリタイプをPrivateKeyEntryではなくTrustedCertEntryにします。

したがって、最初の問題を解決するには、まずopenssl(または同様のツール)を使用してPKCS#12キーストアを作成し、次にキーストアをでインポートする必要がありますkeytool -importkeystore

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.