解決javax.net.ssl.SSLProtocolException: SSL handshake aborted異常

在使用android4.4的手機時,請求https接口發(fā)現(xiàn)拋出了此異常,因為在android4.4及以下的手機默認會關(guān)閉tls1.1或者tls1.2的支持,所以我們需要手動去開啟對tls1.1和tls1.2的支持。

解決辦法如下(部分代碼):

?```

```mBuilder =new OkHttpClient.Builder();

//????OkHttpClient.Builder的配置代碼省略

//android4.4及以下的手機默認不支持tls1.1或者tls1.2,需要手動開啟

if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {

? ? SSLContext sslContext =null;

? ? try {

sslContext = SSLContext.getInstance("TLS");

? ? ? ? try {

sslContext.init(null, null, null);

? ? ? ? }catch (KeyManagementException e) {

e.printStackTrace();

? ? ? ? }

}catch (NoSuchAlgorithmException e) {

e.printStackTrace();

? ? }

SSLSocketFactory socketFactory =new Tls12SocketFactory(sslContext.getSocketFactory());

? ? mBuilder.sslSocketFactory(socketFactory, new UnSafeTrustManager());

}


public class Tls12SocketFactoryextends SSLSocketFactory {

private static final String[]TLS_SUPPORT_VERSION = {"TLSv1.1", "TLSv1.2"};

? ? final SSLSocketFactorydelegate;

? ? public Tls12SocketFactory(SSLSocketFactory base) {

this.delegate = base;

? ? }

@Override

? ? public String[]getDefaultCipherSuites() {

return delegate.getDefaultCipherSuites();

? ? }

@Override

? ? public String[]getSupportedCipherSuites() {

return delegate.getSupportedCipherSuites();

? ? }

@Override

? ? public SocketcreateSocket(Socket s, String host, int port, boolean autoClose)throws IOException {

return patch(delegate.createSocket(s, host, port, autoClose));

? ? }

@Override

? ? public SocketcreateSocket(String host, int port)throws IOException, UnknownHostException {

return patch(delegate.createSocket(host, port));

? ? }

@Override

? ? public SocketcreateSocket(String host, int port, InetAddress localHost, int localPort)throws IOException, UnknownHostException {

return patch(delegate.createSocket(host, port, localHost, localPort));

? ? }

@Override

? ? public SocketcreateSocket(InetAddress host, int port)throws IOException {

return patch(delegate.createSocket(host, port));

? ? }

@Override

? ? public SocketcreateSocket(InetAddress address, int port, InetAddress localAddress, int localPort)throws IOException {

return patch(delegate.createSocket(address, port, localAddress, localPort));

? ? }

private Socketpatch(Socket s) {

if (sinstanceof SSLSocket) {

((SSLSocket) s).setEnabledProtocols(TLS_SUPPORT_VERSION);

? ? ? ? }

return s;

? ? }

}




public class UnSafeTrustManagerimplements 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 new X509Certificate[]{};

? ? }

}```

?```

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容