web-dev-qa-db-ja.com

javax.net.ssl.SSLException:webservice Androidの呼び出し中にSSLハンドシェイクがピアによる接続リセットを中止しました

私はhttps webserviceを呼び出していますが、以前は正常に動作しますが、今それを呼び出そうとすると次のエラーが発生します。

ログエラー:

12-23 06:28:11.969: W/System.err(3014): javax.net.ssl.SSLException: SSL handshake aborted: ssl=0x1cc160: I/O error during system call, Connection reset by peer
12-23 06:28:11.979: W/System.err(3014):     at org.Apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method)
12-23 06:28:11.979: W/System.err(3014):     at org.Apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.Java:474)
12-23 06:28:11.979: W/System.err(3014):     at org.Apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.<init>(OpenSSLSocketImpl.Java:750)
12-23 06:28:11.979: W/System.err(3014):     at org.Apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.getInputStream(OpenSSLSocketImpl.Java:692)
12-23 06:28:11.979: W/System.err(3014):     at crittercism.Android.aa.getInputStream(Unknown Source)
12-23 06:28:11.979: W/System.err(3014):     at org.Apache.http.impl.io.SocketInputBuffer.<init>(SocketInputBuffer.Java:93)
12-23 06:28:11.979: W/System.err(3014):     at org.Apache.http.impl.SocketHttpClientConnection.createSessionInputBuffer(SocketHttpClientConnection.Java:83)
12-23 06:28:11.979: W/System.err(3014):     at org.Apache.http.impl.conn.DefaultClientConnection.createSessionInputBuffer(DefaultClientConnection.Java:170)
12-23 06:28:11.979: W/System.err(3014):     at org.Apache.http.impl.SocketHttpClientConnection.bind(SocketHttpClientConnection.Java:106)
12-23 06:28:11.979: W/System.err(3014):     at org.Apache.http.impl.conn.DefaultClientConnection.openCompleted(DefaultClientConnection.Java:129)
12-23 06:28:11.979: W/System.err(3014):     at org.Apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.Java:171)
12-23 06:28:11.989: W/System.err(3014):     at org.Apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.Java:164)
12-23 06:28:11.989: W/System.err(3014):     at org.Apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.Java:119)
12-23 06:28:11.989: W/System.err(3014):     at org.Apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.Java:359)
12-23 06:28:11.989: W/System.err(3014):     at org.Apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.Java:555)
12-23 06:28:11.989: W/System.err(3014):     at org.Apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.Java:487)
12-23 06:28:11.989: W/System.err(3014):     at org.Apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.Java:465)

Https webserviceを呼び出すために次のコードを使用しています。

public static void trustAllHosts() {

        X509TrustManager easyTrustManager = new X509TrustManager() {

            public void checkClientTrusted(X509Certificate[] chain,
                    String authType) throws CertificateException {
                // Oh, I am easy!
            }

            public void checkServerTrusted(X509Certificate[] chain,
                    String authType) throws CertificateException {
                // Oh, I am easy!
            }

            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }

        };

        // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[] { easyTrustManager };

        // Install the all-trusting trust manager
        try {
            SSLContext sc = SSLContext.getInstance("TLS");

            sc.init(null, trustAllCerts, new Java.security.SecureRandom());

            HttpsURLConnection
                    .setDefaultSSLSocketFactory(sc.getSocketFactory());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static HttpClient getNewHttpClient() {
        try {
            KeyStore trustStore = KeyStore.getInstance(KeyStore
                    .getDefaultType());
            trustStore.load(null, null);

            SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
            sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

            HttpParams params = new BasicHttpParams();
            HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
            HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

            SchemeRegistry registry = new SchemeRegistry();
            registry.register(new Scheme("http", PlainSocketFactory
                    .getSocketFactory(), 80));
            registry.register(new Scheme("https", sf, 443));

            ClientConnectionManager ccm = new ThreadSafeClientConnManager(
                    params, registry);

            return new DefaultHttpClient(ccm, params);
        } catch (Exception e) {
            return new DefaultHttpClient();
        }
    }

MySSLSocketFactory.Java

public class MySSLSocketFactory extends SSLSocketFactory {
    SSLContext sslContext = SSLContext.getInstance("TLS");

    public MySSLSocketFactory(KeyStore truststore)
            throws NoSuchAlgorithmException, KeyManagementException,
            KeyStoreException, UnrecoverableKeyException {
        super(truststore);

        TrustManager tm = new X509TrustManager() {
            public void checkClientTrusted(X509Certificate[] chain,
                    String authType) throws CertificateException {
            }

            public void checkServerTrusted(X509Certificate[] chain,
                    String authType) throws CertificateException {
            }

            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };

        sslContext.init(null, new TrustManager[] { tm }, null);
    }

    @Override
    public Socket createSocket(Socket socket, String Host, int port,
            boolean autoClose) throws IOException, UnknownHostException {
        return sslContext.getSocketFactory().createSocket(socket, Host, port,
                autoClose);
    }

    @Override
    public Socket createSocket() throws IOException {
        return sslContext.getSocketFactory().createSocket();
    }
}

以前は正常に動作していましたが、現在は失敗しています。サーバーで行われた変更はありません。

私はすでに参照しました

  1. Android-Query-ランダムSSLExceptions
  2. 。NET Androidエンドポイントに接続しているRESTのピアエラーによる断続的な接続リセット
  3. ピアによるAndroid HTTPS例外接続のリセット
  4. モバイルデータ接続中にHttpUrlConnectionがSSLExceptionをスローするのはなぜですか

私はwifiとモバイルデータの両方でテストしました。アプリケーションは両方で機能しません。

誰かが以前にこの問題に直面した場合、それを解決するために私を助けてください。

18
DreamsNeverDie

私も同じ例外を受け取りました。 TLS 1.0プロトコルがサーバーでサポートされていないことが原因であることがわかりました。

私は、Androidデバイス、httpへの接続がTLS 1.0はサポートされていません。バグについてどこでも検索しましたが、この問題に関連するものは見つかりませんでした。そして、TLS 1.0 protocolサポートがサーバーに追加されました。 https://www.ssllabs.com/ssltest を使用して、サーバー/ホスト名プロトコルのサポートを確認できます。

28
Ankit

2つの理由が考えられます。

証明書は、クライアントまたはサーバー側で期限切れになる可能性があります。

解決策:既存の証明書の有効期限を延長するか、新しい証明書を変更します。

サーバーポートが他のポートにリセットされました。

解決策:通常、サーバーのメンテナンスまたはパッチの更新が原因でこのポート変更の問題に直面しましたが、サービスのポートが変更される場合があります。サーバーでwsdlを再生成するようにwsdlを提供した人に依頼し、クライアント側の既存のwsdlと一致するかどうかを確認します。おそらくこれがここに当てはまります。

3
kingAm

今朝から同じ問題が発生し、解決しました。

SSLオンIIS 8

  1. 昨日はすべて正常に機能していましたが、昨夜、IISサイトでSSLが更新されました。
  2. サイトのSSLへのバインドをチェックアウトしているときに、IIS8に新しいチェックボックス「サーバー名の表示が必要」が追加されていることに気付きましたが、チェックされなかったため、有効にしました。
  3. それが問題を引き起こしました。
  4. IISに戻り、チェックボックスを無効にしました。..問題は解決しました!
2
Jorge Navarro

一部のAndroidデバイス。同じソリューションが見つかりました。IISサーバー設定で解決策を見つけました。

手順:

  1. IISを開く
  2. 作業しているサイトを選択します
  3. サイトバインドの編集
  4. 必須サーバー名識別のチェックを外します
  5. OKをクリック

参照スクリーンショット:

enter image description here

これがあなたのお役に立てば幸いです。

1
Hiren Patel