jdk 访问 tls 异常

问题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

解决方法:

  1. 让服务器端同时支持TLS1.0 TLS1.2,这样各版本的JDK 均可以正常访问。
  2. java 代码升级到 jdk 8 的环境。
  3. 修改启动参数(需要openjdk 1.7.0_95 以上版本,或者商业的收费版本 )
  4. 修改代码,参考 https://www.baeldung.com/java-7-tls-v12
  5. 使用第三方的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 协商出错。

解决办法:

  1. 加固服务器端,增加强加密算法。
  2. 修改 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

你可能感兴趣的:(jdk 访问 tls 异常)