【问题标题】:javax.net.ssl.SSLException: SSL handshake aborted Connection reset by peer while calling webservice Androidjavax.net.ssl.SSLException:SSL 握手中止连接由对等方重置,同时调用 web 服务 Android
【发布时间】:2014-01-11 13:06:13
【问题描述】:

我正在调用 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 网络服务。

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 - Random SSLExceptions
  2. Intermittent Connection Reset by Peer errors in Android connecting to .NET REST endpoint
  3. Android HTTPS exception Connection reset by peer
  4. Why is HttpUrlConnection throwing an SSLException while on a mobile data connection?

我已经在 wifi 和移动数据中对其进行了测试。应用程序不适用于两者。

如果有人在此之前遇到过这个问题,请帮助我解决它。

【问题讨论】:

  • @Tamilan 我已经浏览了这个链接。我已经在我的问题中提到了。
  • 你有什么解决办法吗?如果是的话是什么??
  • 阅读这里以获得完整的解释和可能的解决方案:stackoverflow.com/questions/30538640/…
  • @DreamsNeverDie 你找到解决方案了吗?我也有同样的问题。

标签: java android web-services ssl https


【解决方案1】:

我也遇到了同样的异常。我发现这是由于服务器不支持 TLS 1.0 协议

我观察到 Android 设备与不支持 TLS 1.0 的服务器的 http 连接失败。我搜索了有关该错误的所有地方,但没有找到与此问题相关的任何内容。当TLS 1.0 protocol 支持添加到服务器时,问题就解决了。您可以使用https://www.ssllabs.com/ssltest 检查您的服务器/主机名协议支持。

【讨论】:

  • 我在某些设备上有时会遇到此异常,但在大多数设备上它工作正常。我在安卓手机上使用 Sim Data。
  • 请注意,不应再使用 TLS 1.0,因为它已被弃用并被视为不安全,启用 TLS1.0 将使您无法通过 PCI 合规性。 comodo.com/e-commerce/ssl-certificates/tls-1-deprecation.php
【解决方案2】:

可能有两个原因:

证书可能在客户端或服务器端过期。

解决方案: 延长现有证书的到期日期或更换新证书。

服务器端口已重置为其他端口。

解决方案: 我遇到过这个端口更改问题,通常是由于服务器维护或补丁更新,有时服务端口会发生变化。请为您提供 wsdl 的人在他们的服务器上重新生成 wsdl,并检查端口号是否与客户端现有的 wsdl 匹配。这里很可能就是这种情况。

【讨论】:

  • 您好,非常感谢您的回复。如果有任何原因,它在iphone中也失败了吗?实际上在 iphone 应用程序中它工作得很好。
  • 好的先生,如果您从 iphone 应用程序调用相同的服务(端点 url),这意味着您可以消除第二个原因,您的服务运行良好。但是每个客户端都需要导入服务器证书或单独使用自签名证书信任该特定 url。
  • 好吧。所以问题是:“服务器端口已重置为其他端口”?您能提供更多帮助吗?或者有什么可能的方法来解决它?
  • 您是在您的 Android 应用程序中交换证书还是信任 url?我对你上面的实现不太了解。但是通过看到错误,它必须对您的证书或端点 url 做一些事情,正如您之前所说的那样,它工作得很好。对于类似的传输协议,服务器中必须有一些配置更改。
  • 以我的方式在客户端过期证书。
【解决方案3】:

从今天早上开始,我们遇到了同样的问题并得到了解决。

IIS 8 上的 SSL

  1. 昨天一切正常,昨晚我们的 SSL 在 IIS 站点上更新。
  2. 在检查站点与 SSL 的绑定时,我们注意到 IIS8 有一个新的复选框“需要服务器名称指示”,但未选中,因此我们继续启用它。
  3. 这引发了问题。
  4. 回到 IIS,禁用复选框....问题解决了!

【讨论】:

    【解决方案4】:

    我在某些 Android 设备上遇到了同样的问题。通过IIS 服务器设置找到解决方案。

    步骤:

    1. 打开 IIS
    2. 选择您正在工作的网站
    3. 编辑网站绑定
    4. 取消选中必需的服务器名称标识
    5. 点击确定

    参考截图:

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2017-02-02
      • 2015-07-11
      • 2016-06-10
      • 2021-01-01
      • 2016-05-29
      • 2019-11-23
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      相关资源
      最近更新 更多