如何为 android 4.1.1 启用 TLS 1.1 和 1.2

How to enable TLS 1.1 and 1.2 for android 4.1.1

我正在使用 Android 4.4 版并尝试通过 HttpTransportSE 调用 Web 服务,但由于未启用 TLS,我的服务器没有响应。如何启用请帮助。我的 http class 代码如下:

String jsonData = "";
    String NameSpace = "http://tempuri.org/";
    String MethodNameGodown = "", SOAP_ACTION = "";
    SoapPrimitive response = null;
    MethodNameGodown = "MethodName";
    SOAP_ACTION = NameSpace + MethodNameGodown;

    SoapObject soapObject = new SoapObject(NameSpace, MethodNameGodown);

    soapObject.addProperty("UserID", username);
    soapObject.addProperty("Password", password);
    soapObject.addProperty("ESN", "xym");
    SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    soapEnvelope.dotNet = true;
    soapEnvelope.setOutputSoapObject(soapObject);

    HttpTransportSE androidHttpTransport = new HttpTransportSE(sharedPreferences.getString("server_Middleware", ""), Constants.loginScreenTimeOut);

   
    try {
        androidHttpTransport.call(SOAP_ACTION, soapEnvelope);
        response = (SoapPrimitive) soapEnvelope.getResponse();

    } catch (IOException e) {
        e.printStackTrace();
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    }
    return response + "";

您需要为此创建自定义 Class。

public class TLSSocketFactory extends SSLSocketFactory {

    private SSLSocketFactory internalSSLSocketFactory;

    public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException {
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, null, null);
        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)) {
            ((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.1", "TLSv1.2"});
        }
        return socket;
    }
}

您可以参考link中的原始代码: https://blog.dev-area.net/2015/08/13/android-4-1-enable-tls-1-1-and-tls-1-2/

刚刚添加的内容,

HttpsURLConnection.setDefaultSSLSocketFactory(new TLSSocketFactory());