- PR -

JavaクライアントからのHTTPS接続について

1
投稿者投稿内容
サビオラ
会議室デビュー日: 2003/11/14
投稿数: 6
投稿日時: 2003-11-17 09:26
初めての書き込みになります。
どうぞよろしくお願いします。
(至らない点などありましたらご指摘ください)

【環境】
Windows2000
JDK1.4

JavaクライアントからのHTTPS接続において、javax.net.ssl.SSLHandshakeException
が出て困っております。

下記コードによりHTTPS接続可能なサイトとSSLHandshakeExceptionが出てしまうサイト
(例えばマイクロソフト)があり(IEではいずれも正常に表示できます)、いろいろ
調査したところ、JDK1.4にはIEなどのブラウザにくらべデフォルトでインストールされて
いるサーバ証明書が非常にすくないことがわかりました。
ただ、以下の2点についてよくわからず、皆さんのお知恵を拝借させていただければと思います。

・サーバ証明書の入手方法
⇒IE右下の鍵マークからエクスポートした.cerファイルでよい?

・JDK1.4へのサーバ証明書のインストール方法
⇒keytool.exeにより上記.cerファイルをimportしましたがダメでした。

【ソースコード】
public static void main(String[] args) {

URL downloadUrl = null;

System.setProperty("https.proxyHost", "<プロキシホスト名>");
System.setProperty("https.proxyPort", "<プロキシポート>");

try {
downloadUrl = new URL("https://winqual.microsoft.com/signup/");

} catch (MalformedURLException me) {
me.printStackTrace();
return;
}
File localFile = new File("C:\\Work\\temp\\download.txt");

URLConnection con = null;
ObjectOutputStream out = null;
BufferedInputStream in = null;
BufferedOutputStream fout = null;

Exception ex = null;
try {
// URL接続
con = downloadUrl.openConnection();

// キャッシュ無効
con.setUseCaches(false);

// URL接続から、データを読み取るバッファリングされた入力ストリームを作成
in = new BufferedInputStream(con.getInputStream());
// データを書き込むバッファリングされた出力ストリームを作成
fout = new BufferedOutputStream(new FileOutputStream(localFile));

// 読み取ったデータを、順次、書き込む
byte[] buf = new byte[1024];
int size;

while ((size = in.read(buf)) != -1) {
fout.write(buf, 0, size);
}

fout.flush();

} catch (Exception e) {
e.printStackTrace();
} finally {
out.close();
in.close();
fout.close();
}

System.out.println("★終了");
}

【実行結果】
javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Could not find trusted certificate
at com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.a(DashoA6275)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA6275)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA6275)
at com.sun.net.ssl.internal.ssl.SunJSSE_az.a(DashoA6275)
at com.sun.net.ssl.internal.ssl.SunJSSE_az.a(DashoA6275)
at com.sun.net.ssl.internal.ssl.SunJSSE_ax.a(DashoA6275)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA6275)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.j(DashoA6275)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(DashoA6275)
at sun.net.www.protocol.https.HttpsClient.afterConnect(DashoA6275)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(DashoA6275)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:574)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(DashoA6275)
at Test.main(Test.java:61)
Caused by: java.security.cert.CertificateException: Could not find trusted certificate
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.a(DashoA6275)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(DashoA6275)
at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(DashoA6275)
... 11 more
★終了



よろしくお願いします。m(__)m


[ メッセージ編集済み 編集者: サビオラ 編集日時 2003-11-17 09:28 ]

[ メッセージ編集済み 編集者: サビオラ 編集日時 2003-11-18 16:52 ]
たけはし
会議室デビュー日: 2004/07/08
投稿数: 3
お住まい・勤務地: 横浜
投稿日時: 2004-07-08 16:29
サビオラさん、もう既に解決してしまいました?

私も同じ問題に遭遇して、このスレッドを見つけたんですが、解答がなくてちょっとがっかり。
でも、以下の情報を発見し、なんとか解決しました。

http://www.ctct.co.jp/tsd/sdb/java_verisign_sun_install.html

要は、ルート証明書をインポートしないといけない、ということでしょうか?

それではご参考まで。

[ メッセージ編集済み 編集者: たけはし 編集日時 2004-07-08 16:34 ]
1

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