android 4.x tls1.2,ssl - Android Enable TLSv1.2 in OKHttp - Stack Overflow

这个博客提供了一个Java实现的TLSSocketFactoryCompat类,用于在Android 4.1-4.4上强制启用TLSv1.1和TLSv1.2支持。通过覆盖SSLSocketFactory的方法并修改默认的协议列表,确保了与旧版SSL协议的安全断开。
摘要由CSDN通过智能技术生成

Turns out my solution is very similar to Ken's (except in Java). I found it here although had to make a couple of small changes to get it to work. Hopefully this works 'out of the box' for others.

public class TLSSocketFactoryCompat extends SSLSocketFactory {

private SSLSocketFactory internalSSLSocketFactory;

public TLSSocketFactoryCompat() throws KeyManagementException, NoSuchAlgorithmException {

SSLContext context = SSLContext.getInstance("TLS");

context.init(null, null, null);

internalSSLSocketFactory = context.getSocketFactory();

}

public TLSSocketFactoryCompat(TrustManager[] tm) throws KeyManagementException, NoSuchAlgorithmException {

SSLContext context = SSLContext.getInstance("TLS");

context.init(null, tm, new java.security.SecureRandom());

internalSSLSocketFactory = context.getSocketFactory();

}

@Override

public String[] getDefaultCipherSuites() {

return internalSSLSocketFactory.getDefaultCipherSuites();

}

@Override

public String[] getSupportedCipherSuites() {

return internalSSLSocketFactory.getSupportedCipherSuites();

}

@Override

public Socket createSocket() throws IOException {

return enableTLSOnSocket(internalSSLSocketFactory.createSocket());

}

@Override

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

return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose));

}

@Override

public Socket createSocket(String host, int port) throws IOException, UnknownHostException {

return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));

}

@Override

public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {

return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort));

}

@Override

public Socket createSocket(InetAddress host, int port) throws IOException {

return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));

}

@Override

public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {

return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort));

}

private Socket enableTLSOnSocket(Socket socket) {

if(socket != null && (socket instanceof SSLSocket)) {

//Create list of supported protocols

ArrayList supportedProtocols = new ArrayList<>();

for (String protocol : ((SSLSocket)socket).getEnabledProtocols()) {

//Log.d("TLSSocketFactory", "Supported protocol:" + protocol);

//Only add TLS protocols (don't want ot support older SSL versions)

if (protocol.toUpperCase().contains("TLS")) {

supportedProtocols.add(protocol);

}

}

//Force add TLSv1.1 and 1.2 if not already added

if (!supportedProtocols.contains("TLSv1.1")) {

supportedProtocols.add("TLSv1.1");

}

if (!supportedProtocols.contains("TLSv1.2")) {

supportedProtocols.add("TLSv1.2");

}

String[] protocolArray = supportedProtocols.toArray(new String[supportedProtocols.size()]);

/*for (int i = 0; i < protocolArray.length; i++) {

Log.d("TLSSocketFactory", "protocolArray[" + i + "]" + protocolArray[i]);

}*/

//enable protocols in our list

((SSLSocket)socket).setEnabledProtocols(protocolArray);

}

return socket;

}

}

Usage:

OkHttpClient httpClient = new OkHttpClient();

//Add Custom SSL Socket Factory which adds TLS 1.1 and 1.2 support for Android 4.1-4.4

try {

httpClient.setSslSocketFactory(new TLSSocketFactoryCompat());

} catch (KeyManagementException e) {

e.printStackTrace();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值