- - PR -
IBM-JavaでHTTPSを行いたい
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-01-13 07:40
IBM-JDK 64bit 1.5.0にてhttpsクライアントを作成しようとしています。
(OSはAIX5です) 1)apache-httpclientを使用して簡単なテストプログラムを作成 2)通信先相手の証明書を取り込み(keytoolにて取り込み) 上記の通り準備し、実際にプログラムを実行すると下記のようなExceptionが発生しました。 Jan 13, 2008 7:32:21 AM org.apache.commons.httpclient.HttpMethodDirector executeWithRetry INFO: I/O exception (javax.net.ssl.SSLKeyException) caught when processing request: RSA premaster secret error Jan 13, 2008 7:32:21 AM org.apache.commons.httpclient.HttpMethodDirector executeWithRetry INFO: Retrying request Jan 13, 2008 7:32:21 AM org.apache.commons.httpclient.HttpMethodDirector executeWithRetry INFO: I/O exception (javax.net.ssl.SSLKeyException) caught when processing request: RSA premaster secret error Jan 13, 2008 7:32:21 AM org.apache.commons.httpclient.HttpMethodDirector executeWithRetry INFO: Retrying request Jan 13, 2008 7:32:21 AM org.apache.commons.httpclient.HttpMethodDirector executeWithRetry INFO: I/O exception (javax.net.ssl.SSLKeyException) caught when processing request: RSA premaster secret error Jan 13, 2008 7:32:21 AM org.apache.commons.httpclient.HttpMethodDirector executeWithRetry INFO: Retrying request javax.net.ssl.SSLKeyException: RSA premaster secret error at com.ibm.jsse2.cb.<init>(cb.java:62) at com.ibm.jsse2.eb.a(eb.java:205) at com.ibm.jsse2.eb.a(eb.java:206) at com.ibm.jsse2.db.m(db.java:250) at com.ibm.jsse2.db.a(db.java:70) at com.ibm.jsse2.jc.a(jc.java:187) at com.ibm.jsse2.jc.g(jc.java:480) at com.ibm.jsse2.jc.a(jc.java:31) at com.ibm.jsse2.j.write(j.java:2) at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:88) at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:146) at org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.java:827) at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:1975) at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:993) at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:397) at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170) at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396) at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324) at SSL_TEST.execute(SSL_TEST.java:56) at SSL_TEST.main(SSL_TEST.java:177) Caused by: java.security.InvalidKeyException: No installed provider supports this key: com.sun.net.ssl.internal.ssl.JSA_RSAPublicKey at javax.crypto.Cipher.a(Unknown Source) at javax.crypto.Cipher.init(Unknown Source) at com.ibm.jsse2.cb.<init>(cb.java:65) ... 19 more 自分なりに調べたところ、IBM-Javaは 「com.sun.net.ssl.internal.ssl.JSA_RSAPublicKey」 クラスを持っておらず(内包しておらず)、証明書から鍵を取り出せないでいるように思えてきました。 SunのサイトからJCEをDownLoadしてみたり、IBMのサイトを探してみたりと調査はしているものの、上記クラスを取り込む事ができず、https通信ができない状態です。 どなたかIBM-Javaでhttps通信を行った事のある方、アドバイスいただけないでしょうか? | ||||
|
投稿日時: 2008-01-15 17:35
私のほうの環境ではすんなり動きますね。
OS: RedHat RHEL4 J2SDK: ibm-java2-sdk-5.0-6.0-linux-i386.tgz HttpClient: commons-httpclient-3.1.tar.gz 特別な設定は何もしてないです。 J2SDKとHttpClientをダウンロードしてきて、マニュアルに載っているサンプルプログラム を動かしたらすんなり動きました。 念のためこちらの環境におけるセキュリティプロバイダの設定を載せておきます( といってもデフォルトのままです)。 ファイル名は/usr/local/java/j2sdk/jre/lib/security/java.securityです。
| ||||
|
投稿日時: 2008-01-16 09:24
返信ありがとうございます。
>コード: >security.provider.1=com.ibm.jsse2.IBMJSSEProvider2 >security.provider.2=com.ibm.crypto.provider.IBMJCE >security.provider.3=com.ibm.security.jgss.IBMJGSSProvider >security.provider.4=com.ibm.security.cert.IBMCertPath >security.provider.5=com.ibm.security.sasl.IBMSASL 当方のjava.securityファイル内プロバイダーは下記のようになっています。 security.provider.1=sun.security.provider.Sun security.provider.2=com.sun.net.ssl.internal.ssl.Provider security.provider.3=com.ibm.jsse.IBMJSSEProvider security.provider.4=com.sun.crypto.provider.SunJCE security.provider.5=com.ibm.crypto.provider.IBMJCE security.provider.6=com.ibm.security.jgss.IBMJGSSProvider security.provider.7=com.ibm.security.cert.IBMCertPath security.provider.8=com.ibm.security.sasl.IBMSASL Sunのプロバイダーも入っているのですが・・・ いまだに動きません(症状が変わりません) もしかして・・・ >security.provider.1=com.ibm.jsse2.IBMJSSEProvider2 security.provider.3=com.ibm.jsse.IBMJSSEProvider 上記二つが微妙に異なるのですが、これが原因でしょうか・・・? とりあえずIBMに確認してみます。 | ||||
|
投稿日時: 2008-01-16 22:21
関係あるかもしれませんね。基本的にはJSSE2を使うべきだと思います。 参考資料 Sun製J2SDK 1.5のJSSE実装 http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/security/jsse/JSSERefGuide.html IBM製J2SDK 1.5のJSSE実装 http://www.ibm.com/developerworks/java/jdk/security/50/secguides/jsse2Docs/JSSE2RefGuide.html -Djavax.net.debug=helpでデバッグオプションを確認して、デバッグオプションつきで 実行してみると、何か分かるかもしれませんね。 | ||||
|
投稿日時: 2008-01-23 13:34
随分と間が空いてしまいましたが、結末を報告します。
>>security.provider.1=com.ibm.jsse2.IBMJSSEProvider2 >security.provider.3=com.ibm.jsse.IBMJSSEProvider > >上記二つが微妙に異なるのですが、これが原因でしょうか・・・? 調査した所、上記は元々デフォルトで security.provider.1=com.ibm.jsse2.IBMJSSEProvider2 と、記述されているのだそうです。 デフォルトだと下記プロバイダーが登録されているようです。 security.provider.1=com.ibm.jsse2.IBMJSSEProvider2 security.provider.2=com.ibm.crypto.provider.IBMJCE security.provider.3=com.ibm.security.jgss.IBMJGSSProvider security.provider.4=com.ibm.security.cert.IBMCertPath security.provider.5=com.ibm.security.sasl.IBMSASL きっと、コチラの障害を調査している誰かが security.provider.3=com.ibm.jsse.IBMJSSEProvider と、書き換えている事まで判明しました。 で、 com.ibm.jsse2.IBMJSSEProvider2 プロバイダーの中には com.sun.net.ssl.internal.ssl.JSA_RSAPublicKey クラスは存在しないので、プロバイダーをIBMJSSEProvider2に変更した所で、問題は解決しないであろう事が推測できました。 結局、J2EEデフォルトの機能だけでhttps出来るよう、自前でhttpsクライアントを作成する事にしました。 作成するhttpsクライアントは、javax.net.sslのみを使用するように実装しています。 今の所、無事https通信できるようになったのですが、根本的に(別の)問題を抱えている気がしています。 ですが、それはこのスレッドとは別問題なので、ここでは記述を控えます。 (いずれ又、相談すると思います) 結論: IBM-JDKを使用してcom.sun.net.ssl.internal.ssl.JSA_RSAPublicKeyを 使った証明書は取り扱えなかった・・・。 (javax.net.sslのみで実装するようにするしかない) と、なってしまいました・・・どなたかスマートなやり方を御存知の方がいれば、御教え下さい。 色々とアドバイス頂きありがとうございました。 |
1