java - 如何在我的 android studio 应用程序中实现 TLS V1.1 和 V1.2?

标签 java web-services ssl android-studio tls1.2

我已经在我的主机中购买了 SSL 证书,但我不知道如何在我的 java 代码端(使用 Android Studio)实现。

这是我的 TLSSocketFactory.java(我从另一个页面复制了这个类并将其放入我的 java 代码中)

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;

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

这是我使用 get 和 post 的方法:

获取方法:

import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.nio.charset.Charset;

public class JSONParser {

public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
    InputStream is = new URL(url).openStream();
    try  {
        BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
        String jsonText = readAll(rd);
        return new JSONObject(jsonText);
    } finally {
        is.close();
    }
}

private static String readAll(Reader rd) throws IOException {
    StringBuilder sb = new StringBuilder();
    int cp;
    while ((cp = rd.read()) != -1) {
        sb.append((char) cp);
    }
    return sb.toString();
}

}

POST 方法:

public String  performPostCall(String requestURL, HashMap<String, String> postDataParams) {

    URL url;

    StringBuffer response = new StringBuffer();
    try {
        url = new URL(requestURL);

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(15000);
        conn.setConnectTimeout(15000);
        conn.setRequestMethod("POST");
        conn.setDoInput(true);
        conn.setDoOutput(true);


        OutputStream os = conn.getOutputStream();
        BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(os, "UTF-8"));
        writer.write(getPostDataString(postDataParams));

        writer.flush();
        writer.close();
        os.close();
        int responseCode=conn.getResponseCode();

        if (responseCode == HttpsURLConnection.HTTP_OK) {
            String line;
            BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream()));

            while ((line=br.readLine()) != null) {
                response.append(line);
            }
            br.close();
        }
        else {
            response.append("");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return response.toString();
}
private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException {
    StringBuilder result = new StringBuilder();
    boolean first = true;
    for(Map.Entry<String, String> entry : params.entrySet()){
        if (first)
            first = false;
        else
            result.append("&");

        result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
        result.append("=");
        result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
    }

    return result.toString();
}

<强>1。问题 N° 1: 如何将我的 TLSSocketFactory 实例与我的 POST 和 GET 请求混合?抱歉我的菜鸟问题。

<强>2。第 2 个问题: 我是否在我的 Web 服务中做了一些事情?还是只获取带有证书的 Web 服务就可以了?

谢谢!

最佳答案

如果您的 URL 以 https:// 开头,则返回的连接是一个 HttpsUrlConnection,您可以在连接到服务器之前在其上设置使用的套接字工厂:

TLSSocketFactory myTlsSocketFactory = new TLSSocketFactory();
...
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(myTlsSocketFactory);

关于java - 如何在我的 android studio 应用程序中实现 TLS V1.1 和 V1.2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36647128/

相关文章:

java - 如何在java swing中自动递增字符串?

java - 尝试调用虚方法

ssl - 如何为 rabbitmq 添加密码套件支持?

ssl - 您如何与您的证书颁发机构签署证书签名请求?

c# - 使用 C# 以编程方式创建并信任 SSL 证书?

java - 如何声明扩展注释的通用类

java - 显示不确定的进度指示器

Node.JS 和共享库/FastCGI

java - 如何删除 Netbean 6.8 中的生成源(jax-ws)?我应该根据网站地址从 WSDL 生成 WS 客户端还是从 api 生成 WS 客户端?

xml - SoapUI 在模拟服务脚本中获取请求参数