- PR -

IBM-JavaでHTTPSを行いたい

1
投稿者投稿内容
WT
常連さん
会議室デビュー日: 2004/07/22
投稿数: 29
投稿日時: 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通信を行った事のある方、アドバイスいただけないでしょうか?
blunder
ベテラン
会議室デビュー日: 2003/09/11
投稿数: 65
投稿日時: 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です。
コード:
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


WT
常連さん
会議室デビュー日: 2004/07/22
投稿数: 29
投稿日時: 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に確認してみます。
blunder
ベテラン
会議室デビュー日: 2003/09/11
投稿数: 65
投稿日時: 2008-01-16 22:21
引用:

>security.provider.1=com.ibm.jsse2.IBMJSSEProvider2
security.provider.3=com.ibm.jsse.IBMJSSEProvider

上記二つが微妙に異なるのですが、これが原因でしょうか・・・?



関係あるかもしれませんね。基本的には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でデバッグオプションを確認して、デバッグオプションつきで
実行してみると、何か分かるかもしれませんね。
WT
常連さん
会議室デビュー日: 2004/07/22
投稿数: 29
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)