我正在尝试对其他服务器实施基于SSL的HTTPS连接。
我需要提供所有协议(TLSv1.0
,TLSv1.1
,TLSv1.2
,TLSv1.3
),无论哪个可用或启用,它都应该能够自行协商该版本。
当前,是这样的:
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, /*some certs*/, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
String webServicePath =" https://google.com" //suppose
URL url = new URL(webServicePath);
HttpsURLConnection httpsCon = (HttpsURLConnection) url.openConnection();
httpsCon.setRequestMethod("POST");
httpsCon.setRequestProperty("Content-Type", "application/json");
httpsCon.setRequestProperty("Content-Language", "en-US");
httpsCon.setUseCaches(false);
httpsCon.setDoInput(true);
httpsCon.setDoOutput(true);
httpsCon.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
httpsCon.connect();
我想要类似的东西: SSLContext.getInstance(“ TLSv1.0,TLSv1.1,TLSv1.2”); ,但我不确定此方法是否采用多个参数。
我找到了解决方案: Dhttps.protocols = TLSv1.2,TLSv1.1,TLSv1”在启动Java VM或在代码中时,等效的系统属性指令是“ System.setProperty(“ https.protocols” ,“ TLSv1.2,TLSv1.1,TLSv1”)”。
我想以编程方式在我的代码中执行此操作,但是我不知道该怎么做。
我了解到,客户端和服务器通过HELLO消息进行协商,直到他们同意二人组支持的协议版本为止。为了实现这种协商,我必须在源代码中实现它吗?