javax.net.ssl.SSLException:SSL握手中止连接在调用webservice Android时由对等方重置

我打电话给https webservice和它的工作正常之前,但现在当我试图把它称为它给我下面的错误。

logging错误:

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的查询 – 随机SSLExceptions
  2. 连接到.NET REST端点的Android中的间歇连接重置错误
  3. Android HTTPSexception由对等方重置连接
  4. 为什么HttpUrlConnection在移动数据连接时抛出SSLException?

我已经testing了无线和移动数据。 应用程序不适用于这两个。

如果之前有人遇到这个问题,请帮我解决。

我也有同样的例外。 我发现这是由于服务器不支持TLS 1.0协议

我观察到Android设备,http连接不支持TLS 1.0的服务器。 我search了每个关于这个bug的地方,但没有发现任何与这个问题有关的东西。 当TLS 1.0 protocol支持被添加到服务器时,问题就解决了。您可以使用https://www.ssllabs.com/ssltest来检查您的服务器/主机名协议支持&#x3002;

可能有两个原因:

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

解决scheme:扩展现有证书的到期date或更换新的证书。

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

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

我们今天早上开始了这个相同的问题,并得到解决。

IIS 8上的SSL

  1. 昨天和昨天的每一件事情都很好,我们的SSL在IIS网站上更新了。
  2. 当检查站点绑定到SSL,我们注意到,IIS8有一个新的checkbox“要求服务器名称指示”,它没有被检查,所以我们继续启用它。
  3. 这引发了这个问题。
  4. 回到IIS,禁用checkbox….问题解决了!

对于某些Android设备,我遇到了同样的问题。 通过IIS服务器设置find解决scheme。

脚步:

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

参考截图:

在这里输入图像说明

希望这会帮助你。