javax.net.ssl.SSLHandshakeException:连接由com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(本机方法)上的peer关闭

在api level 24之前,我的代码工作正常,但它在api level 24(7.0牛轧糖)上给我错误。 我没有得到我的代码出了什么问题。

第一种方法是:

         xyz.com      

内部清单文件:

android:network Security Config = "@xml/network_security_config"我在res/xml/network_security_config包含了res/xml/network_security_configca证书在res/raw/my_ca.pem

第二种方法是:

  import org.apache.http.client.HttpClient; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.impl.client.DefaultHttpClient; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import java.security.KeyManagementException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; public class ExSSLSocketFactory extends SSLSocketFactory { SSLContext sslContext = SSLContext.getInstance("TLS"); public ExSSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException,KeyStoreException, UnrecoverableKeyException { super(truststore); TrustManager x509TrustManager = 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[] { x509TrustManager }, null); } public ExSSLSocketFactory(SSLContext context) throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, UnrecoverableKeyException { super(null); sslContext = context; } @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(); } public static HttpClient getHttpsClient(HttpClient client) { try{ X509TrustManager x509TrustManager = new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public X509Certificate[] getAcceptedIssuers() { return null; } }; SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, new TrustManager[]{x509TrustManager}, null); SSLSocketFactory sslSocketFactory = new ExSSLSocketFactory(sslContext); sslSocketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); ClientConnectionManager clientConnectionManager = client.getConnectionManager(); SchemeRegistry schemeRegistry = clientConnectionManager.getSchemeRegistry(); schemeRegistry.register(new Scheme("https", sslSocketFactory, 443)); return new DefaultHttpClient(clientConnectionManager, client.getParams()); } catch (Exception ex) { return null; } } } 

在进行http连接时:

 public String CallWebService(String url, String soapAction, String envelope){ final HttpClient httpClient = ExSSLSocketFactory.getHttpsClient(new DefaultHttpClient()); HttpParams params = httpClient.getParams(); HttpConnectionParams.setConnectionTimeout(params, 150000); HttpConnectionParams.setSoTimeout(params, 150000); HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), true); HttpPost httppost = new HttpPost(url); httppost.setHeader("soapaction", soapAction); httppost.setHeader("Content-Type", "text/xml; charset=utf-8"); String responseString = ""; try { HttpEntity entity = new StringEntity(envelope); httppost.setEntity(entity); ResponseHandler rh = new ResponseHandler() { public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException { HttpEntity entity = response.getEntity(); StringBuffer out = new StringBuffer(); byte[] b = EntityUtils.toByteArray(entity); out.append(new String(b, 0, b.length)); return out.toString(); } }; responseString = httpClient.execute(httppost, rh); Log.d("Response is here....", "responseString : " + responseString); } catch (Exception e) { e.printStackTrace(); } // close the connection httpClient.getConnectionManager().shutdown(); return responseString; } 

我仍然得到错误:

javax.net.ssl.SSLHandshakeException:连接由对等关闭01-24 10:28:03.182 32251-474 / com.neosoft.meconnect W / System.err:at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method )01-24 10:28:03.182 32251-474 / com.neosoft.meconnect W / System.err:
在com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:357)01-24 10:28:03.182 32251-474 / com.neosoft.meconnect W / System.err:
at com.android.okhttp.Connection.connectTls(Connection.java:235)01-24 10:28:03.182 32251-474 / com.neosoft.meconnect W / System.err:at com.android.okhttp.Connection.connectSocket (Connection.java:199)01-24 10:28:03.182 32251-474 / com.neosoft.meconnect W / System.err:at com.android.okhttp.Connection.connect(Connection.java:172)01-24 10:28:03.182 32251-474 / com.neosoft.meconnect W / System.err:at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:367)01-24 10:28:03.182 32251-474 / com .neosoft.meconnect W / System.err:
在com.android.okhttp.OkHttpClient $ 1.connectAndSetOwner(OkHttpClient.java:130)01-24 10:28:03.182 32251-474 / com.neosoft.meconnect W / System.err:
在com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:329)01-24 10:28:03.182 32251-474 / com.neosoft.meconnect W / System.err:
在com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:246)01-24 10:28:03.183 32251-474 / com.neosoft.meconnect W / System.err:
在com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)01-24 10:28:03.183 32251-474 / com.neosoft.meconnect W / System.err:
在com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:126)01-24 10:28:03.183 32251-474 / com.neosoft.meconnect W / System.err:
在com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:89)01-24 10:28:03.184 32251-474 / com.neosoft.meconnect W / System.err:
在com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java)01-24 10:28:03.184 32251-474 / com.neosoft.meconnect W / System.err:
at org.ksoap2.transport.ServiceConnectionSE.connect(ServiceConnectionSE.java:46)01-24 10:28:03.184 32251-474 / com.neosoft.meconnect W / System.err:
在org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:68)01-24 10:28:03.184 32251-474 / com.neosoft.meconnect W / System.err:
在srd.gshelp.GSSoapConWSDL.javaHit(GSSoapConWSDL.java:180)01-24 10:28:03.184 32251-474 / com.neosoft.meconnect W / System.err:at srd.gshelp.GSSoapConWSDL.access $ 0(GSSoapConWSDL。 java:144)01-24 10:28:03.185 32251-474 / com.neosoft.meconnect W / System.err:at srd.gshelp.GSSoapConWSDL $ TaskAsync.doInBackground(GSSoapConWSDL.java:215)01-24 10:28 :03.185 32251-474 / com.neosoft.meconnect W / System.err:
在srd.gshelp.GSSoapConWSDL $ TaskAsync.doInBackground(GSSoapConWSDL.java:1)01-24 10:28:03.185 32251-474 / com.neosoft.meconnect W / System.err:
在android.os.AsyncTask $ 2.call(AsyncTask.java:304)01-24 10:28:03.185 32251-474 / com.neosoft.meconnect W / System.err:at java.util.concurrent.FutureTask.run( FutureTask.java:237)01-24 10:28:03.186 32251-474 / com.neosoft.meconnect W / System.err:at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)01-24 10 :28:03.186 32251-474 / com.neosoft.meconnect W / System.err:
at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:607)01-24 10:28:03.186 32251-474 / com.neosoft.meconnect W / System.err:
at java.lang.Thread.run(Thread.java:761)01-24 10:28:03.187 32251-474 / com.neosoft.meconnect W / System.err:Suppressed:javax.net.ssl.SSLHandshakeException:Connection closed通过同行

请帮助。 提前致谢。

    确保已从服务器端启用TLS

    你使用过Okhttp库吗? 这是一个非常好的网络电话库。 你也可以处理这个例外。

    我有类似的问题,我用这个管理它:

     public static OkHttpClient getHttpClientForFile() { ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) .tlsVersions(TlsVersion.TLS_1_0) .cipherSuites( CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA, CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA, CipherSuite.TLS_RSA_WITH_3DES_EDE_CBC_SHA) .build(); return new OkHttpClient.Builder() .connectTimeout(2, TimeUnit.MINUTES) .writeTimeout(2, TimeUnit.MINUTES) .readTimeout(3, TimeUnit.MINUTES) .connectionSpecs(Collections.singletonList(spec)) .protocols(Arrays.asList(Protocol.HTTP_1_1)) .build(); } 

    我不知道它是否好,但它对我有用。

    您使用SSLSocketFactory的类可能会在Play商店中发布应用程序后产生错误,或者Play商店可能会警告您更改代码。

    您可以从https://github.com/square/okhttpfindOkhttp库。