[解決済み】SSL接続のリセット
質問
Java で HTTPS エンドポイントに接続しようとしています。私が試したすべてのメソッド(詳細は後述)は、このスタックトレースを生成するために終了します。
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:293)
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:331)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:798)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:753)
at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:75)
試してみました。
- javax SOAP libsと新しいURL("https://...")を使って接続する。
- 新しいURL("https://...").openConnection()で接続中。
-
SSL接続を手動で作成する。
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault(); SSLSocket socket = (SSLSocket) factory.createSocket("...", 443); Writer out = new OutputStreamWriter(socket.getOutputStream()); // https requires the full URL in the GET line // out.write("GET / HTTP/1.0\r\n"); out.write("\r\n"); out.flush(); // read response BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream())); int c; while ((c = in.read()) != -1) { System.out.write(c); } out.close(); in.close(); socket.close();
もう少し詳しく
- 私が試したすべての方法は、他のSSLサーバーではうまくいきましたが、この特定のサーバーではうまくいきません(どのサーバーかは自由に話すことができません、ビジネスパートナーです)。
- このサーバーには、ウェブブラウザーでも、curlでSOAPリクエストを偽装しても接続できます。
つまり、Java と HTTPS サーバーの間で、どのようにハンドシェイクを行うべきかについて何らかの不一致があることは明らかで、おそらくサーバーに奇妙な SSL 設定があることを意味します。しかし、私はそのサーバーに直接アクセスすることができませんし、アクセスできる人は地球の裏側にいるので、時間帯が大きく異なるため、コミュニケーションは少しぎくしゃくしています。
もし私の推測が正しければ、SSLにどんな問題がある可能性がありますか?何がこのようなことを引き起こす可能性があるのでしょうか?サーバーを管理している人に問題を探すには、どこに問い合わせればよいでしょうか?curlでリクエストすると、これらのサーバー構成ヘッダが返ってきます。
Server: Apache/2.2.9 (Debian) mod_jk/1.2.26 PHP/5.2.6-1+lenny10 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g mod_perl/2.0.4 Perl/v5.10.0
X-Powered-By: PHP/5.2.6-1+lenny10
X-SOAP-Server: NuSOAP/0.7.3 (1.114)
解決方法は?
SSLバージョンの問題です。サーバはSSLv3しかサポートしておらず、Javaはv2で開始し、上方へのネゴシエーションを試みますが、すべてのサーバがそのタイプのネゴシエーションをサポートしているわけではありません。
javaがSSLv3のみを使用するように強制することが、私が知っている唯一の解決策です。
編集部:私が知っている限り、これを行うには2つの方法があります。
-
ソケットを手動で作成する場合は、有効なプロトコル
socket.setEnabledProtocols(new String[] { "SSLv3" });
-
より高いレベルのライブラリを使用している場合、おそらくすべての SSL リクエストが v3 のみを使用するように設定する必要があります。
"https.protocols"
システム・プロパティを使用します。java -Dhttps.protocols=SSLv3
関連
-
[解決済み】不正な反射的アクセスとは?
-
[解決済み】Javaクラスの "型に解決できない"
-
[解決済み】Javaの部分文字列:「文字列のインデックスが範囲外」。
-
[解決済み】非閉鎖文字リテラルエラー
-
[解決済み] メソッドがそのスーパークラスのメソッドをオーバーライドしない
-
[解決済み】Javaを使用するSelenium - ドライバの実行ファイルのパスは、webdriver.gecko.driverシステムプロパティで設定する必要があります。
-
[解決済み】Hibernateの例外「failed to lazily initialize a collection of role」の解決方法
-
[解決済み] OpenSSLを使用して自己署名入りSSL証明書を生成する方法を教えてください。
-
[解決済み] PEMエンコードされた証明書からSSL証明書の有効期限を判断する方法は?
-
[解決済み] IISExpressでのSSL接続・接続解除について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Android Studio クラス org.codehaus.groovy.runtime.InvokerHelper を初期化できませんでした。
-
[解決済み】エラー。Selection does not contain a main type
-
[解決済み】popBackStack()とreplace()の操作はどう違うのですか?
-
[解決済み] java のクラス内のコンストラクタは、指定された型に適用できない
-
[解決済み】スレッド「main」での例外 java.lang.StringIndexOutOfBoundsException: 文字列のインデックスが範囲外です。0 [閉店]
-
[解決済み] 二項演算子「&」のオペランド型がおかしい java
-
[解決済み】HTTPステータス500 サーブレットクラスのインスタンス化エラー [重複]。
-
[解決済み] メソッドがそのスーパークラスのメソッドをオーバーライドしない
-
[解決済み】スレッド "main "での例外 java.util.NoSuchElementException
-
[解決済み】 executeQuery()でデータ操作文が発行できない。)