问题1: 协议不匹配:JDK 7 访问 tls 异常, JDK8 正常
参考文档
https://blogs.oracle.com/java-platform-group/diagnosing-tls,-ssl,-and-https
JDK7 默认行为: TLS1.0
JDK8 默认行为: TLS1.2
测试方法:
openssl s_client -connect www.domain.com:443 -tls1
启动参数(需要openjdk 1.7.0_95 以上版本,或者商业的收费版本 )
java -Djavax.net.debug=all -Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2
解决方法:
- 让服务器端同时支持TLS1.0 TLS1.2,这样各版本的JDK 均可以正常访问。
- java 代码升级到 jdk 8 的环境。
- 修改启动参数(需要openjdk 1.7.0_95 以上版本,或者商业的收费版本 )
- 修改代码,参考 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 正常
原因:服务器进行了安全加固,只允许高强度加密算法,JDK7 默认自带的算法强度有限。
Oracle JDK7 默认: 不包含 JCE
Oracle JDK8 默认: 包含 AES256 等高强度算法。 最新的 jdk 202 已经自带 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 正常。
原因: 服务器的配置不安全,只支持弱加密算法,jdk 202 默认不再支持 3DES 算法,导致 JDK8 协商出错。
解决办法:
- 加固服务器端,增加强加密算法。
- 修改 JDK 环境,允许 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