- - PR -
JSPでセキュリティ証明書が無効のサイトをimport
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-07-06 11:20
JSPでセキュリティ証明書が無効のサイトをimport
<c:import url="https://localhost:8443/hoge/" /> すると、下記の例外が発生します。 ---- javax.servlet.ServletException: javax.servlet.jsp.JspException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target ---- これを回避する方法は、有効なセキュリティ証明書を インストールするしかないのでしょうか? 一時的に許可することはできないでしょうか? セキュリティ証明書を購入するのは時期尚早で、 セキュリティ証明書を購入するにも、localhostなので テストできなくて困っています。 | ||||
|
投稿日時: 2006-07-06 12:04
少し前に関連する話題(クライアント認証)が出ていましたが、
1. ${java.home}/lib/security/cacertsに信頼させたいサイトの証明書を取り込む 2. 信頼させたいサイトの証明書を取り込んだKeyStoreを指定して使わせる 3. 全ての証明書を黙って信用するTrustManagerを実装する のどれかだと思います。 接続先のサイトが不特定多数でないのならば、1か2でしょうね。 | ||||
|
投稿日時: 2006-07-06 16:57
コメントありがとうございます。
> 2. 信頼させたいサイトの証明書を取り込んだKeyStoreを指定して使わせる これにしたいです。 自分なりに調べてやってみましたが、同じ現象になります。 手順が間違っているのでしょうか?ご指摘いただければ幸いです。 サーバー側(CentOS 4) 1. サーバー証明書を作成する # cd /usr/share/ssl/certs # make <サーバー>.pem 2. インポート用サーバー証明書を作成する # openssl x509 -in <サーバー>.pem -outform DER -out <サーバー>.der クライアント側(Windows XP) 3. インポート用サーバー証明書をサーバーからダウンロードする 4. インポート用サーバー証明書をKeyStoreにインポートする > keytool -import -trustcacerts -keystore <KeyStoreファイル> -file <サーバー>.der ---- キーストアのパスワードを入力してください: xxxx : この証明書を信頼しますか? [no]: yes 証明書がキーストアに追加されました。 ---- 5. Tomcatを再起動する イマイチ、Webサーバーで指定した証明書との関連がわからないのですが。 よろしくお願いいたします。 | ||||
|
投稿日時: 2006-07-06 17:26
デフォルトのTrustStoreとして指定する必要があると思います。
自分では試したことがないのでそれで可能なのか保証できませんが。 設定方法はJSSE リファレンスガイドに書いてあります。 | ||||
|
投稿日時: 2006-07-07 00:06
JavaVMが確認できるKeyStoreを設定する必要があるのでは。 Tomcatだとしたら、Tomcatが起動する(されてる)デフォルトでKeyStoreを 設定されてると思います。 http://www.jajakarta.org/tomcat/tomcat5.0/ja/docs/tomcat-docs/ssl-howto.html にあるとおり。 で、ほとんどの場合、キーストアのパスワードが"changeit"を仮定している(苦笑) 変えられないよな〜、とか思いながら見てるのですが。。。 | ||||
|
投稿日時: 2006-07-07 10:43
JSSEがデフォルトで使用するTrustStoreに設定する必要はありますが、 Tomcatの<Connector>で指定したKeyStoreはJSSEのデフォルトとは違います。 <c:import>で取り込む場合はTomcatのConnectorとは関係なさそうに思います。 java.net.URLでhttpsを指定した場合のデフォルトに設定しないといけないわけで。 | ||||
|
投稿日時: 2006-07-10 17:37
お返事が遅くなり、申し訳ございません。
結論から言いますと、解決しました。 ありがとうございました。 皆様のコメントを頼りに、いろいろ調べて試してみました。 コメントをくださった方はわかっていらっしゃると思いますが、 同じ悩みをもたれた方のために私の理解を記します。 まず、先の私が記述した手順の中で、<KeyStoreファイル> というのがありますが、これにいくつか種類があります。 A. JVMがデフォルトで使用する<KeyStoreファイル> → <ユーザーディレクトリ>/.keystore B. Tomcatで使用する<KeyStoreファイル> → <TOMCAT_HOME>/conf/server.xml で指定した<KeyStoreファイル> デフォルト:<Tomcatを起動するユーザーのユーザーディレクトリ>/.keystore C. システムキーストア(root CA) → <JAVA_HOME>/lib/security/cacerts(<JAVA_HOME>/jre/lib/security/cacerts ) で、 > 2. 信頼させたいサイトの証明書を取り込んだKeyStoreを指定して使わせる これをやる場合は、B(Aかな?)について ・サーバーにクライアントの証明書 ・クライアントにサーバーの証明書 をインポートしなければなりません。 サーバー側にもインポートするのがイヤだったので、 > 1. ${java.home}/lib/security/cacertsに信頼させたいサイトの証明書を取り込む こちらにしました。 これをやる場合は、Cについて ・クライアントにサーバーの証明書 をインポートします。 これで例外は出なくなりました。 サーバーの証明書の入手についてですが、 CAを用いる場合、CAからルート証明書を入手します。 CACertで試してみました。 http://www.cacert.org/index.php?id=3 このページより、Root Certificate (DER Format) を取得して、 > keytool -import -alias cacert -file root.der -noprompt -trustcacerts -keystore %JAVA_HOME%/jre/lib/security/cacerts ---- キーストアのパスワードを入力してください: changeit 証明書がキーストアに追加されました。 ---- で、OKです。 CAを用いない場合は、クライアントのkeystoreから証明書をエクスポートします。 > keytool -export -alias <別名> -keystore clientKeys -file client.cer -keystore <KeyStoreファイル> そして、 > keytool -import -alias <別名> -file client.cer -noprompt -trustcacerts -keystore %JAVA_HOME%/jre/lib/security/cacerts ---- キーストアのパスワードを入力してください: changeit 証明書がキーストアに追加されました。 ---- で、OKです。 以上です。 |
1