SSブログ

Apache HTTPDのサーバ証明書をTomcatに使いまわせと言われたら [Linux]

あんまりないかもしれないですけど、Apache HTTPD用のサーバ証明書を同じホストの上で動かすTomcatに使えと言われたとします。そもそもHTTPD用にopensslコマンドで作るキーと、keytoolで作るキーは違うんだから、両立できないんじゃないかと思われるかもしれません。自分もそう思っていました。だけど両立はできます。できるからやれと言われたんだけど、あからさまに使い回す記事がなかったので探すのにちょっと苦労しました。


まずopensslでサーバ証明書を作る手順を考えると、
「秘密鍵を作る→CSRファイルを作る→サーバ証明書を発行してもらう」
という流れになっていると思います。

これはjavaのkeytoolでもだいたい同じですが、keytoolが出すキーストアファイルとopensslで出力されるファイルが違うのでそのままでは使いまわせません。それにキーストアファイルは他の証明書を取り込んでいくし、テキストファイルではなくバイナリファイルになっているので変換が必要になります。

やることは
https://qiita.com/yasushi-jp/items/89bd88e13949c73d0f16
にあるのだけれど、ちょっと補足しておきます。

必要なのは
6. 秘密鍵と証明書をPKCS12形式に変換
9. PKCS12キーストアをJKSキーストアに変換
のところだけで、あとは確かめる作業なのでそこまで重要ではありません。
確認したい方はどうぞというところ。まぁダメな時はダメなのでもう一回やり直したほうが早いです。

流れ的には上に書いたけど、
「OpenSSLで作った秘密鍵と証明鍵を用意→pkcs12なファイルに変換→JKSファイルに変換」
という流れ。JKS形式のファイルがTomcatのキーストアファイルになるから、Tomcatにインストールする流れで使える。

ただ、キーストアファイルとしてはすでにサーバー証明書を取り込んでいる状態だから、再度サーバ証明書を取り込もうとするとエラーになる。エラーにはなるが取り込まなくても入っているので、そのままで問題ないはず。エラーコードは取ってないので提示できません、すいません。identicalとかいう単語が出てきたはず。

それとパスワードもパラメーターの中に入れているけれども、これはその時入力しなくても後で入力を促されるので、必ずしも入れなければならないわけではないです。変な記号とか入っているパスワード類はコマンドラインのワンライナーでは入力できないこともあるので、最初から入れてあげられない場合はコマンドの中で入力すればいいだけです。多分下のもので最低限だったはず。
openssl pkcs12 -export -in 「証明書のファイル名」 -name 「エイリアス」 -inkey 「秘密鍵のファイル名」  -out 「PKCS12キーストアのファイル名」 

keytool -importkeystore -srckeystore 「PKCS12キーストアのファイル名」 -srcstoretype PKCS12  -destkeystore 「JKSキーストアのファイル名」 -deststoretype JKS

元のサイトのだとザラザラとパスワードを書き込まないといけないので、bashとかのコマンド履歴を見られたら一発でバレる。こういう書き方をするのはインタラクティブな操作を説明しないといけないのが面倒なだけなので、他のパスワードを含むコマンドを打つように言われた時にも気をつけるようにしたい。シェルスクリプトとかで生成したい場合は仕方ないけど、その時もファイルのオーナーをrootにしたりしてパーミッションを700にするとか自衛手段は最低取らないといけない。

httpd(openssl)もtomcat(keytool)も自分のやり方があるだろうから細かくは書かなかった。オレオレ証明書でいいなら、上のサイトと同じようにやればいい。オレオレ証明書はお金があったらなるべく使いたくはないよな。ブラウザにえんがちょ認定されるし。http/3ではオレオレ証明書はChrome経由だと普通に使えないっぽいし。


普通はhttpdとtomcatを同一サーバに立てるなんてことはしないんだろうけど、どうしてもしたい場合はこういうふうにやれば大丈夫。できれば別のインスタンスとかに入れて運用したいところだけど、やれと言われたらやるしかないよね…




《追記》
上で書かれていることは間違っていない。だけれど最善ではない。Webブラウザでは問題ないのだが、OpenSSLを使っているツールを使っている場合、つなぐとエラーが出て問題になる。

OpenSSLで作ったサーバ証明書と秘密鍵を、Tomcat用(java用)のキーストアファイルにコンバートするのは間違っていないのだが、後から中間証明書等を入れるのがまずかったらしい。keytool自体でkeystoreファイルにルートや中間証明書を入れることはできるのだが、
keytool -v -list -keystore キーストアファイル

で出てくる文字列が「Certificate chain length: 3」となっていないとダメらしい。先の方法だとあとからRootCAとか中間CA証明書をkeytoolで入れたとしても、「Certificate chain length: 1」でチェインしていないと判断されるらしい。

具体的な作業としては以下

・CAのファイルがx509なテキストファイルじゃなかった時に変換(バイナリだとつなげられん)
openssl x509 -in rootca.cer -inform der -out rootca.cer.der

・rootCA(rootca.cer.der)と中間CA(ica.cer)のファイルをつなげる
cat rootca.cer.der ica.cer > cachain.cer

・pkcs12のファイルに変換(秘密鍵:sever.key, サーバ証明書:server.cer)
openssl pkcs12 -inkey server.key -in server.cer -export -out keystore.p12 -CAfile cachain.cer -chain

・pkcs12からJKSに変換
keytool -importkeystore -srckeystore keystore.p12 -srcstoretype PKCS12  -destkeystore keystore.jks -deststoretype JKS


基本的に、チェインするCAのファイルも指定してあげること以外は変わっていない。keystore.jksを任意の場所に置いて、設定ファイルでその場所を指定してあげるだけでいいはず。

これで晴れてOpenSSLコマンドにも文句が言われなくなって、ブラウザ越しじゃない通信も大丈夫になった。というか、前提のサーバ証明書がみんなオレオレ証明書だったりするから、こんな細かいことを気にしなくてもいいんだよな。オレオレ証明書だった時にはOpenSSLには蹴られないんだろうか…


・参考にしたサイト

https://www.ibm.com/docs/ja/api-connect/10.0.1.x?topic=overview-generating-pkcs12-file-certificate-authority

https://www.ssl.com/ja/%E3%82%AC%E3%82%A4%E3%83%89/pem-der-crt%E3%81%8A%E3%82%88%E3%81%B3cer-x-509%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A8%E5%A4%89%E6%8F%9B/

https://glorificatio.org/archives/2914

というか、最初はサーバ証明書と秘密鍵を引き出して、そこからJavaのキーストアファイルを生成しようとしていたから八方塞がりだった。基本的に鍵ペアはkeytoolで自動生成だもんなぁ…。方法がなくて当たり前かもなぁ。何にしてもできたからいいや。貧乏な会社はやることも多いから知っていて損はない。というか、お金くれなかったらオレオレ証明書か…

コメント(0) 
共通テーマ:パソコン・インターネット

コメント 0