当前,我必须使用Java 7(无法更改其atm),默认TLS版本为1.0(?),因此低于1.2。现在我必须使用一个不接受TLSv1.2以下的TLS的REST Api。
所以我的解决方案是:
REST调用之前:
System.setProperty("https.protocols", "TLSv1.2"); // Adding this System property only for this one function call. Has to be executed every time before
然后是GET Call本身:
...
URL url = new URL("https://test.com");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("GET");
...
现在我的问题是:是否有其他方法可以设置“ https.protocols”属性,因此我不必在系统中进行设置?
此系统属性是否会影响同时执行的来自其他类的REST调用,还不确定。
答案 0 :(得分:1)
我相信您可以直接在HttpsURLConnection上设置TLS协议,这样,它将仅本地应用到该连接。
首先初始化TLSv1.2 SSLContext
SSLContext sc = SSLContext.getInstance("TLSv1.2");
// Init the SSLContext with a TrustManager[] and SecureRandom()
sc.init(null, trustCerts, new java.security.SecureRandom());
有关init()参数的文档:
“前两个参数中的任何一个都可以为null,在这种情况下 将搜索安装的安全提供程序的最高优先级 实施适当的工厂。同样,安全随机 参数可以为null,在这种情况下,默认实现为 使用。”
之后,只需在HttpsURLConnection上设置此SSLContext:
httpsCon.setSSLSocketFactory(sc.getSocketFactory());
如果出于调试目的而需要对TrustCert进行全信任(尽管不安全的实现),则可以像这样初始化它并将其用作init()中的第二个参数。
(此实现完全禁用了SSL检查,因此不应在调试/开发情况之外使用)
// Create a trust manager that does not validate certificate chains
TrustManager[] trustCerts = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
}
};