【问题标题】:How to enable TLS 1.1 and 1.2 for android 4.1.1 [duplicate]如何为 android 4.1.1 启用 TLS 1.1 和 1.2 [重复]
【发布时间】:2019-04-29 02:20:37
【问题描述】:

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

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 + "";

【问题讨论】:

  • 你能按照我的代码给出解决方案吗?

标签: android android-studio tls1.2 android-ksoap2


【解决方案1】:

您需要为此创建一个自定义类。

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;
    }
}

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

添加后,

HttpsURLConnection.setDefaultSSLSocketFactory(new TLSSocketFactory());

【讨论】:

  • 我应该在哪里添加这一行:HttpsURLConnection.setDefaultSSLSocketFactory(new TLSSocketFactory());
  • @Aks,在打开任何网络连接之前添加此内容
  • 它正在工作,但响应较晚。表示服务器响应延迟。
猜你喜欢
  • 2019-06-04
  • 2020-02-15
  • 2019-04-12
  • 2016-09-16
  • 2016-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
相关资源
最近更新 更多