問題1: 協(xié)議不匹配:JDK 7 訪問 tls 異常, JDK8 正常
參考文檔
https://blogs.oracle.com/java-platform-group/diagnosing-tls,-ssl,-and-https
JDK7 默認(rèn)行為: TLS1.0
JDK8 默認(rèn)行為: TLS1.2
測試方法:
openssl s_client -connect www.domain.com:443 -tls1
啟動參數(shù)(需要openjdk 1.7.0_95 以上版本,或者商業(yè)的收費版本 )
java -Djavax.net.debug=all -Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2
解決方法:
- 讓服務(wù)器端同時支持TLS1.0 TLS1.2,這樣各版本的JDK 均可以正常訪問。
- java 代碼升級到 jdk 8 的環(huán)境。
- 修改啟動參數(shù)(需要openjdk 1.7.0_95 以上版本,或者商業(yè)的收費版本 )
- 修改代碼,參考 https://www.baeldung.com/java-7-tls-v12
- 使用第三方的ssl 庫,比如 http://www.bouncycastle.org/java.html
6 使用 okhttp
ConnectionSpec requireTls12 = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
.tlsVersions(TlsVersion.TLS_1_2)
.build();
OkHttpClient client = new OkHttpClient.Builder()
.connectionSpecs(Arrays.asList(requireTls12))
.build();
問題2: 加密算法不匹配:JDK 7 訪問 tls 異常, JDK8 正常
原因:服務(wù)器進行了安全加固,只允許高強度加密算法,JDK7 默認(rèn)自帶的算法強度有限。
Oracle JDK7 默認(rèn): 不包含 JCE
Oracle JDK8 默認(rèn): 包含 AES256 等高強度算法。 最新的 jdk 202 已經(jīng)自帶 JCE。
解決辦法:
下載 JDK7 JCE Policy 文件,解壓并覆蓋到 jre 目錄( jdk1.7.0_80/jre/lib/security )。
unzip -jo UnlimitedJCEPolicyJDK7.zip -d /usr/java/jdk1.7.0_80/jre/lib/security
問題3: 加密算法不匹配:JDK 8 訪問 tls 異常, JDK 7 正常。
原因: 服務(wù)器的配置不安全,只支持弱加密算法,jdk 202 默認(rèn)不再支持 3DES 算法,導(dǎo)致 JDK8 協(xié)商出錯。
解決辦法:
- 加固服務(wù)器端,增加強加密算法。
- 修改 JDK 環(huán)境,允許 3DES 算法 。
sed -i -r -e 's/3DES_EDE_CBC,\s*//' /usr/java/jdk1.8.0_202/jre/lib/security/java.security
問題4: okhttp 訪問 http/2 出錯
升級到最新版本 okhttp