关于Android4.x系统支持TLS1.2的解决方案

来源:互联网 发布:文明5 mac steam 汉化 编辑:程序博客网 时间:2024/04/29 12:13

为Http请求的网络客户端设置一个特殊的SSLSocketFactory。

这个代理SSLSocketFactory在创建一个Socket连接的时候,会设置Socket的可用的TLS版本。

private static final String[] TLS_SUPPORT_VERSION = {"TLSv1.1", "TLSv1.2"}; ((SSLSocket) s).setEnabledProtocols(TLS_SUPPORT_VERSION);

代理类如下:

public class Tls12SocketFactory extends SSLSocketFactory {    private static final String[] TLS_SUPPORT_VERSION = {"TLSv1.1", "TLSv1.2"};    final SSLSocketFactory delegate;    public Tls12SocketFactory(SSLSocketFactory base) {        this.delegate = base;    }    @Override    public String[] getDefaultCipherSuites() {        return delegate.getDefaultCipherSuites();    }    @Override    public String[] getSupportedCipherSuites() {        return delegate.getSupportedCipherSuites();    }    @Override    public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {        return patch(delegate.createSocket(s, host, port, autoClose));    }    @Override    public Socket createSocket(String host, int port) throws IOException, UnknownHostException {        return patch(delegate.createSocket(host, port));    }    @Override    public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {        return patch(delegate.createSocket(host, port, localHost, localPort));    }    @Override    public Socket createSocket(InetAddress host, int port) throws IOException {        return patch(delegate.createSocket(host, port));    }    @Override    public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {        return patch(delegate.createSocket(address, port, localAddress, localPort));    }    private Socket patch(Socket s) {        if (s instanceof SSLSocket) {            ((SSLSocket) s).setEnabledProtocols(TLS_SUPPORT_VERSION);        }        return s;    }}

HttpsUrlConnection

SSLContext sslContext = SSLContext.getInstance("TLS");            sslContext.init(null, null, null);            SSLSocketFactory socketFactory = new Tls12SocketFactory(sslContext.getSocketFactory());HttpsUrlConnection.setDefaultSSLSocketFactory(socketFactory)

OkHttp

OkHttpClient.Builder builder = new OkHttpClient.Builder()                    .connectTimeout(20 * 1000, TimeUnit.MILLISECONDS)                    .readTimeout(20 * 1000, TimeUnit.MILLISECONDS);            SSLContext sslContext = SSLContext.getInstance("TLS");            sslContext.init(null, null, null);            SSLSocketFactory socketFactory = new Tls12SocketFactory(sslContext.getSocketFactory());            builder.sslSocketFactory(socketFactory, xtm);            okHttpClient = builder.build();
0 1
原创粉丝点击