2013-12-23 51 views
16

我打電話給https webservice和它的工作正常,但現在當我試圖稱它爲它給我下面的錯誤。javax.net.ssl.SSLException:SSL握手中止連接在調用webservice時由對等方重置Android

日誌錯誤:

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) 

我使用下面的代碼來調用Web服務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(); 
    } 
} 

是以前工作正常,但現在失敗。在服務器中沒有任何更改。

我已經refered

  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和移動數據進行了測試。應用程序不適用於兩者。

如果有人在此之前遇到這個問題,請幫我解決它。

+0

@泰米蘭我已經通過這個鏈接。我已經在我的問題中提到過了。 – DreamsNeverDie

+0

你有沒有得到任何解決方案?如果是的,它是什麼? – Abhinav

+0

閱讀此以獲取完整說明和可能的解決方案:http://stackoverflow.com/questions/30538640/javax-net-ssl-sslexception-read-error-ssl-0x9524b800-io-error-during-system?lq=1 –

回答

3

可能有2個原因:

證書可能在客戶端或服務器端過期。

解決方案: 延長現有證書的有效期或更換新證書。

服務器端口已被重置爲某個其他端口。

解決方案: 我遇到了這個端口更改問題,通常是由於服務器維護或補丁更新,有時服務的端口會發生變化。詢問提供了wsdl的人在其服務器上重新生成wsdl,並檢查端口號是否與客戶端的現有wsdl匹配。這很可能是這種情況。

+0

你好,非常感謝你的回覆。如果有任何理由,它也在iphone中失敗?其實在iPhone應用程序完美的工作。 – DreamsNeverDie

+0

好吧,先生,如果你從iPhone應用程序調用相同的服務(端點url),這意味着你可以消除第二個原因,你的服務工作正常。但是每個客戶端都需要導入服務器證書或者分別使用自簽名證書來信任該特定的URL。 – kingAm

+0

Okey。所以問題是:「服務器端口已被重置爲其他端口」?你能多幫一點,或者有什麼可以解決的辦法? – DreamsNeverDie

26

我也有同樣的例外。我發現這是由於服務器不支持TLS 1.0協議

我觀察到Android設備http連接失敗,服務器不支持TLS 1.0。我搜索了每個關於該錯誤的地方,但沒有發現與此問題相關的任何內容。問題解決了,當TLS 1.0 protocol支持被添加到服務器。您可以使用https://www.ssllabs.com/ssltest檢查您的服務器/主機名協議支持。

+7

我在某些設備上有時會發生這種異常,但在大多數設備上它工作正常。我在android手機上使用Sim Data。 –

+0

請注意,不應再使用TLS 1.0,因爲它已被棄用且被視爲不安全,並且啓用TLS1.0將使您無法達到PCI合規性。 https://www.comodo.com/e-commerce/ssl-certificates/tls-1-deprecation.php –

2

今天早上我們有同樣的問題,並得到解決。在IIS 8

  1. SSL每一件事情是工作的罰款昨天和昨晚我們的SSL被更新的IIS站點。

  2. 在簽出SSL綁定站點時,我們注意到IIS8有一個新的複選框「Require Server Name Indication」,它沒有被選中,所以我們繼續啓用它。
  3. 引發了問題。
  4. 回到IIS,禁用複選框....問題解決!
0

我在某些Android設備上遇到同樣的問題。通過IIS服務器設置找到解決方案。

步驟:

  1. 打開IIS
  2. 選擇您正在
  3. 編輯位點結合
  4. 取消選中所需的服務器名稱標識的網站
  5. 單擊確定

參考截圖:

enter image description here

希望這會幫助你。

相關問題