TomcatでHTTPS、SSL通信やらせる
Tomcatには標準でHTTPやHTTPSコネクタがついている訳ですが、フツーはmod_jkとかで連携して、HTTP(S)通信はApacheをフロントエンドに挟むのではなかろうか。
で、ちょっとした理由でApacheをフロントエンドとせずにTomcatをHTTP(S)Dとしたのだが、SSL周りが結構意味不明だったというか、慣れなかったのでメモ。
・まずはJavaのkeytoolでkeystoreファイルを作成
ApacheのSSLに慣れた身としては(Opensslに慣れた身としては)まずこっから面食らったんですが…。
[ - ]# jsdk/bin/keytool -genkey -alias tomcat -keyalg RSA -keystore .keystore
Enter keystore password:
What is your first and last name?
[Unknown]: www.example.co.jp
What is the name of your organizational unit?
[Unknown]:
What is the name of your organization?
[Unknown]: OPENSPHERE Inc.
What is the name of your City or Locality?
[Unknown]: Hachioji
What is the name of your State or Province?
[Unknown]: Tokyo
What is the two-letter country code for this unit?
[Unknown]: JP
Is CN=www.example.co.jp, OU=Unknown, O=OPENSPHERE Inc., L=Hachioji, ST=Tokyo, C=JP correct?
[no]: yesEnter key password for
(RETURN if same as keystore password): <エンター>
コマンドをたたくことで一発で色々な作業ができる。
これは.keystoreというキーと証明書を格納するファイルを生成する…と同時にキーを生成し*1、さらにそのキーに属する各種情報(CN(CommonName)とか)を入力する…。
ちなみに、aliasのtomcatはtomcatで使う場合固定らしい。
…どうよ、Opensslに慣れてる人だったら意味がわかんなくね?俺はわかんなかった。
OpenSSLだと生のキー(全く情報はない)を生成して、その生のキーに対応するcsrを生成して…とかなのだが、順序がさっぱり違う。。
さらに意味不明なのが、生のキーをつっこむ方法(または取り出す方法)がさっぱりわからなかった。
証明書は高いから、できればキーとセットで使い回したいのに、これでは使い回す事ができないじゃないか?やり方があるのかな?keytoolのコマンドラインヘルプを軽く見た限り、俺にはみつけられなかった。
後、
What is your first and last name?
[Unknown]: www.example.co.jp
って無しだよな、普通にCommonnameって書いてあればいいのに。最初普通に名前いれちゃったよ(苦笑)
jsdk/bin/keytool -certreq -alias tomcat -file tomcat.csr -keystore .keystore
Enter keystore password:
キーを生成した時点でCN等の情報はすべて入っているので、パスワードを入れた瞬間にcsrが出てきます。
出てきたCSRは見慣れた形式で、普通に発行業者に渡せばオッケー。
(今回激安証明書を購入したので、後で書きます)
・証明書をkeystoreファイルにインポート
$ keytool -import -keystore ./.keystore -alias tomcat -file tomcat.crt
Enter keystore password:
keytool error: java.lang.Exception: Failed to establish chain from reply
ドキュメントにあるように上を実行すると、上みたいなエラーが出ることがある。
これは証明書のChainがうまくいかないためで、rootCAの証明書をいれてやらないといけない。
今回はRapidSSLの証明書を入れたので、RapidSSLのroot証明書をつっこむ。
http://www.rapidssl.com/cps/rapidssl_01.cer
をDLしてきて
$ keytool -import -trustcacerts -keystore .keystore -alias root - file rapidssl_01.cer
Enter keystore password:
Certificate already exists in system-wide CA keystore under alias
Do you still want to add it to your own keystore? [no]: yes
Certificate was added to keystore
と実行する。すでにこのキーあるぜと言われるけれど、多分古いからChainがつながらないのだろう。
Yesとして上書きする。
改めて
keytool -import -keystore ./.keystore -alias tomcat -file tomcat.crt
Enter keystore password:
Certificate reply was installed in keystore
とやると無事キーがインポートされる。
・後はserver.xmlの設定するだけ
tomcat/conf/server.xmlを開き、
とかなんとか設定しちゃったりする。
Tomcatのバージョンで設定方法がまちまちなので、デフォルトの設定ファイルでコメントアウトされているSSL通信のくだりをアンコメントして使うと良いでしょう。
後は再起動して、普通にブラウザでアクセスして、鍵マークが赤くなってなければOK。
- -
とにかくkeytoolが意味不明でした。
Javaの関係でこうなんだろうけれど、謎過ぎた。
*1:ちなみに鍵強度はデフォルトで1024bitらしい