- PR -

httpsサイトへデータ送信について

投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2004/06/03
投稿数: 30
投稿日時: 2005-05-02 20:26
>itkmh さん
返信、ありがとうございます。

参考のURLを拝見してました。そして、
「java -Djava.protocol.handler.pkgs=com.sun.net.ssl.internal.www.protocol」
で実行すると、ClassCastのエラーは回避されました。

ただし、
>url.openConnection()の戻り値をSystem.out.println
で確認したところ、
「sun.net.www.protocol.https.DelegateHttpsURLConnection:https://www.xxxx/cgi-bin/test.cgi」となりました。

そして、今度は次のエラーが発生しました。
「javax.net.ssl.SSLHandshakeException:
 java.security.cert.CertificateException: Could not find trusted certificate」

よろしくお願いします。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2005-05-02 21:07
未記入さん、

念のためですが、テストサーバ側は HTTPSに対応している
のですね?
つばさ
ベテラン
会議室デビュー日: 2005/02/05
投稿数: 54
投稿日時: 2005-05-02 21:09
つばさです。

JDK1.3でSSL(通信経路を暗号化する目的のみで)通信を行ったときの手順を
示します。(かなり昔の事なので役にたつかどうかは?ですが)参考までに。

○JSSEのjarを%JAVA_HOME%\\jre\\lib\\extにコピーします。(以下の3つ)
 ・jcert.jar
・jnet.jar
 ・jsse.jar

○JREのセキュリティプロバイダの設定を追加します。
 %JAVA_HOME%\\jre\\lib\\security\\java.securtiyをエディタで開き
 security.provider.3=com.sun.net.ssl.internal.ssl.Provider
 を追加します。

○HTTPSで通信を行うJavaプログラムの引数に
 -Djava.protocol.handler.pkgs=com.sun.net.ssl.internal.www.protocol
 を追加します。

○相手先のサーバの証明書をインポートする。
 相手先のサーバ証明書がserver.certとして適当なフォルダにコピーします。
 keytool -import -keystore jssecacerts -file server.cert
 Enter keystore password: →yes
Trust this certificate? [no]: →yes
ここで、jssecacertsが作成されるので、これを
 %JAVA_HOME%\\jre\\lib\\securityにコピーします。

これで、http→httpsに変更すれば、SSLでの通信が行われます。
また、SSLのハンドシェイクを確認したいときは、-Djava.net.debug=all
を指定すれば、やりとりがわかるので解決の糸口になります。

 
 
未記入
常連さん
会議室デビュー日: 2004/06/03
投稿数: 30
投稿日時: 2005-05-09 15:31
コメントが遅くなりましたが。。。
Kissinger、つばささん、返信ありがとうございました。

>Kissingerさん
当初、SSLの証明のないサーバでテストしていたのですが、
現在は、SSL証明のあるサーバでテストしています。

>つばささん
おかげさまで、かなり進むことができました!
それと、「-Djava.net.debug=all」も設定して
いるのですが、これといったログがでません。

エラー時のみ何かログが出るものなのでしょうか??


それから、次なる問題が発生しています。
現在、以下の部分で通信が固まってしまい、先へ
進みません。
OutputStream os = XX.getOutputStream();

Javaの問題というよりは、ネットワーク設定の問題と
思うのですが、何かご存知の方がいらっしゃれば、
ご教授ください。
つばさ
ベテラン
会議室デビュー日: 2005/02/05
投稿数: 54
投稿日時: 2005-05-09 22:23
つばさです。

すみません。-Djava.net.debug=allは、アプレットのお話でした。
うそをついて、混乱させてしまったことをお詫びします。
ネットワークモニタなどで通信のダンプをみてください。

ちょっとTomcat5.0.30とJDK1.3.1_15で試してみました。
(以下のソース)
---------
 URL helloURL = new URL("https://localhost");
 URLConnection con = helloURL.openConnection();

 con.setDoOutput(true);
 PrintWriter out = new PrintWriter(con.getOutputStream());
 out.print("msg=Hello+World");
 out.close();

 BufferedReader in = new BufferedReader(
  new InputStreamReader(con.getInputStream()));
 String line;
 while ((line = in.readLine()) != null) {
  System.out.println(line);
 }
 in.close();
--------
こちらでは、問題なくSSLで通信できます。
getOutputStream()で固まるのは、ちょっとわかりかねます。
(ネットワークモニタでパケットを確認されてはいかがでしょうか)

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