JettyにSSLを

SSLいきます。

まぁ、公式ドキュメントですね。
http://wiki.eclipse.org/Jetty/Howto/Configure_SSL

■Generating Key Pairs and Certificates
JDK付属のkeytool使って、鍵のペアとCSRを作るのよって事ですね。
とりあえず、CSR作成用のディレクトリでも作ってそこで作業します。
Windows7で、JDK1.6u25です。

SSLは初歩的な知識しかないので、調べたところ、
気をつけることは、
鍵長が1024で作成したCSRを受け付けない証明証発行会社が多いので、2048bitで作成する。
(2010年問題 http://news.mynavi.jp/articles/2010/02/10/2010/index.html)
ただ、ロードバランサでのSSLアクセラレーションのパフォーマンスに影響があるらしい。
まぁ、今のところ、バランサは必要ないので、とりあえずやってみよう。

JDKのkeytoolのドキュメントは、こちら。
http://docs.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html
日本語は、1.3ですが、こっち。
http://java.sun.com/j2se/1.3/ja/docs/ja/tooldocs/win32/keytool.html
1.6の日本語ドキュメントは、すぐ出て来なかったです。

keystore作成

C:\jetty\csrGen>keytool -keystore local.keystore -alias hoge_local -genkey -keyalg RSA -keysize 2048 -validity 365
キーストアのパスワードを入力してください:
新規パスワードを再入力してください:
姓名を入力してください。
  [Unknown]:  コモンネーム
組織単位名を入力してください。
  [Unknown]:  (入力しませんでした)
組織名を入力してください。
  [Unknown]:  whoisで確認出来るOrganization
都市名または地域名を入力してください。
  [Unknown]:  whoisで確認出来るCity
州名または地方名を入力してください。
  [Unknown]:  whoisで確認出来るState
この単位に該当する 2 文字の国番号を入力してください。
  [Unknown]:  jp
CN=***, OU=***, O=***, L=***, ST=tokyo, C=jp でよろしいですか?
  [no]:  yes

<hoge_local> の鍵パスワードを入力してください。
        (キーストアのパスワードと同じ場合は RETURN を押してください):
C:\jetty\csrGen>

これでkeystoreが出来ました。

・Requesting a Trusted Certificate

keytool -certreq -alias hoge_local -keystore local.keystore -file local.csr

これで、CSRが出来ました。

んで、安いおRapid-SSLを使います。
Rapid-SSL.jpで取りました。
SSLを取りたいドメインのメールアドレスが無いので、whois変更(ムームードメイン)したりしました。
いやー早い。すげー早い。あっという間に証明証来ました。
中間証明書(secondary_inter.cerで保存)、SSLサーバ証明書(hoge-local.crtで保存)が送られてきました。
ルート証明書も必要なので、メールに書いてあるURLから落としてきます。(primary_inter.cerで保存)

で、それぞれ、インポートしていきます。
https://knowledge.verisign.com/support/ssl-certificates-support/index?page=content&actp=CROSSLINK&id=AR234
会社違うけど、ここの方が分かりやすいかな。
http://jp.globalsign.com/support/server/05.html

ルート証明書

keytool -import -trustcacerts -alias primaryIntermediate -keystore local.keystore -file primary_inter.cer

そしたら、警告出ました。

証明書は、別名 <geotrustglobalca> のシステム規模の CA キーストア内にすでに存在します。
キーストアに追加しますか? [no]:  no

既にあるんですね・・・。

中間証明書

keytool -import -trustcacerts -alias secondaryIntermediate -keystore local.keystore -file secondary_inter.cer

OK。

サーバ証明書

keytool -import -trustcacerts -alias hoge_local -keystore hoge-project.keystore -file hoge-local.crt

OK。

なんか気持ちいいですね。どこどこ突っ込んでく感じが。
これで、keystoreが出来上がりました。
あとはJetty。

start.ini
jetty-ssl.xmlコメントアウトされているので、解除。

web.xml
SSLを要求するように変更します。
http://www.techscore.com/tech/Java/JavaEE/Servlet/10-3/

<user-data-constraint>
	<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>

jetty.xml
公式のドキュメントに、
http://wiki.eclipse.org/Jetty/Howto/Configure_SSL#Setting_the_Port_for_https
「The most common mistake at this point is to try to access port 8443 with http rather than https.
If you are using CONFIDENTIAL or INTEGRAL security constraints,
you should also configure the normal HTTP connector with the port to use for SSL:」
とある。HTTPconnectorを使えって事ね。デフォルトののまんまで。

jetty-ssl.xml
ほぼそのまま使えますが、変更するのは、
KeyStore、TrustStoreを、作成したkeystoreがあるパスに。
KeyStorePassword、KeyManagerPassword、TrustStorePasswordを、作成したkeystoreのパスワードに。
MD5いけるかなと思ったんですが、OBF形式でないとダメでした。

で終わりと思ったら、サーブレットに対して、
GETだと、http://localhost:8080/servletで動くけど、
POSTだと、動かない。サーブレットにリクエストが来ない。
もちろん、GETでもPOSTでもhttps://localhsot:8443/servletなら問題なし。
JettyのドキュメントのHTTPconnectorを使えって事で、
8080→8443な動きをすると期待してたけど、POSTがうまくいかないなぁ・・・。
もちょっと色々見てみよう。