質問: Java Spark(jettyの方)で読み込ませられるキーストアを作成したいのですが、方法が分かりません。 SSLは初めてで理解できていないので意味不明なことを言っていたらすいません。 正しいと思う内容で解釈していただければと思います。 ジオトラストラピッドSSLにて取得済みのため、現在手元にあるのは **・サーバーキー(server.key)** **・サーバー証明(server.crt)** **・ジオトラスト中間証明(chain.crt)** **・ジオトラストから貰ったサーバー証明(aaa.crt)** です。 ※↑拡張子とファイルの形式が違うとのコメントを頂きました。 誤解を招かないようにそのコメントだけここに引用して後で修正しておきます。 > > aaa.crt がサーバー証明書 > > server.crt は拡張子が .crt ですが、中身は CSR aaa.crt があれば必要ありません。 > > > これらファイルからキーストアファイル(JKS形式?)を作成したいのですがさっぱり分かりません。 1つのkeystoreファイルをプログラムで読み込めがSSLが使えるようになるようにしてくて、(Sparkではそうでないといけない) 上記ファイルを元に1つのkeystoreファイルを作りたいです 一度pkcs12にして、そこからkeystoneに変換しようとして以下を試しました。 **・chain.crt と aaa.crt を結合(multiple.crt)** pkcsを作成するために以下のコマンドを実行しました。 ``` openssl pkcs12 -inkey server.key -in multiple.crt -export -out super.pkcs12 -nodes -nocerts ``` (最後の「-nodes -nocerts」をつけないと「No certificate matches private key」というエラーが発生しました。) それをkeystore(JKS?)に変換しようとして下を実行しました ``` keytool -importkeystore -srckeystore super.pkcs12 -srcstoretype PKCS12 -destkeystore keystone ``` すると「keytoolエラー: java.lang.NullPointerException: invalid null input」というエラーが出て先に進めないです。 --- 追記 server.crtは BEGIN CERTIFICATE REQUEST chain.crtは BEGIN CERTIFICATE これらを結合した「server_chain.crt」はただ単に両方をテキストで結合しただけです > > -----BEGIN CERTIFICATE REQUEST----- > > xxxx > > -----END CERTIFICATE REQUEST----- > > > -----BEGIN CERTIFICATE----- > > xxxx > > -----END CERTIFICATE----- > > > --- 追記(本題ではないがこれも多いかと、、、) これら方法でキーストアファイルを作ってもプログラムで読み込むと「Cannot recover key」というエラーが出る可能性があります。(プログラムによっては必ず) Java Sparkの場合ですが、キーストアファイルを指定するメソッドにはキーストアファイルのパスワードしか入力するところがありません。 キーストア内のエイリアスのパスワード?とキーストアのパスワードを同じにする必要があります。 (エイリアス名、入力パスなどはこの質問のベストアンサーから) ``` keytool -keypasswd -keystore keystore -alias myserver ```
回答: openssl pkcs12 コマンドのオプションに `-chain` が必要なのではないでしょうか。 ``` openssl pkcs12 -inkey server.key -in server+chain.crt -export -out super.pkcs12 -name myserver -CAfile aaa.crt -caname root -chain keytool -importkeystore -srckeystore super.pkcs12 -srcstoretype PKCS12 -srcalias myserver -destkeystore keystore -deststoretype JKS ``` ### 訂正、まとめ すみません、読み違えました。aaa.crt がサーバー証明書なのですね。 ``` openssl pkcs12 -inkey server.key -in aaa+chain.crt -export -out super.pkcs12 -name myserver keytool -importkeystore -srckeystore super.pkcs12 -srcstoretype PKCS12 -srcalias myserver -destkeystore keystore -deststoretype JKS ```