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

    xiaoxiao2021-03-31  60

    为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();
    转载请注明原文地址: https://ju.6miu.com/read-665288.html

    最新回复(0)