c/fe

http://d.hatena.ne.jp/uzulla から移行しました。

TomcatでHTTPS、SSL通信やらせる

Tomcatには標準でHTTPやHTTPSコネクタがついている訳ですが、フツーはmod_jkとかで連携して、HTTP(S)通信はApacheをフロントエンドに挟むのではなかろうか。


で、ちょっとした理由でApacheをフロントエンドとせずにTomcatをHTTP(S)Dとしたのだが、SSL周りが結構意味不明だったというか、慣れなかったのでメモ。


・まずはJavaのkeytoolでkeystoreファイルを作成
ApacheSSLに慣れた身としては(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]: yes

Enter key password for
(RETURN if same as keystore password): <エンター>

コマンドをたたくことで一発で色々な作業ができる。
これは.keystoreというキーと証明書を格納するファイルを生成する…と同時にキーを生成し*1、さらにそのキーに属する各種情報(CN(CommonName)とか)を入力する…。
ちなみに、aliasのtomcattomcatで使う場合固定らしい。


…どうよ、Opensslに慣れてる人だったら意味がわかんなくね?俺はわかんなかった。
OpenSSLだと生のキー(全く情報はない)を生成して、その生のキーに対応するcsrを生成して…とかなのだが、順序がさっぱり違う。。
さらに意味不明なのが、生のキーをつっこむ方法(または取り出す方法)がさっぱりわからなかった。
証明書は高いから、できればキーとセットで使い回したいのに、これでは使い回す事ができないじゃないか?やり方があるのかな?keytoolのコマンドラインヘルプを軽く見た限り、俺にはみつけられなかった。


後、

What is your first and last name?
[Unknown]: www.example.co.jp

って無しだよな、普通にCommonnameって書いてあればいいのに。最初普通に名前いれちゃったよ(苦笑)


Csr(証明書リクエスト)を生成する

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らしい