前景回顾
因为公司项目需要,需要对接亚马逊iot,向亚马逊iot发送消息,使用的是亚马逊的sdk,一切看似正常,然而测试服报错,本地环境正常。
本地JDK配置:
java version "11.0.11" 2021-04-20 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.11+9-LTS-194)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.11+9-LTS-194, mixed mode)
测试服JDK配置:
openjdk version "11.0.12" 2021-07-20 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.12+7-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.12+7-LTS, mixed mode, sharing)
有很大差别么,并没有太大差别,本地使用的是oracle JDK11 ,服务器因为懂得都懂的原因,使用的是openJDK11,仅此而已,但是程序始终会报错:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
解决问题
先改了一个配置
找到一个链接,是oracle官网的一个链接,oracle证书的说明,大致意思是Oracle的JDK将不再信任赛门铁克发布的TLS证书,这与谷歌、Mozilla、苹果和微软最近宣布的类似计划一致。如有必要,您可以通过在java.security配置文件的jdk.security.caDistrustPolicies安全属性中注释掉或删除“SYMANTEC_TLS”来绕过这些限制。
https://blogs.oracle.com/java/post/oracles-plan-for-distrusting-symantec-tls-certificates-in-the-jdk
上述的这个配置,在JAVA_HOME/conf/security/java.security这个文件,以文本方式打开,大概在1187行附近,有这么一句jdk.security.caDistrustPolicies=SYMANTEC_TLS需要注释掉,改成如下:
#jdk.security.caDistrustPolicies=SYMANTEC_TLS
然后,然后服务器上还是不行,淦!
中间又做了很多尝试,就不详叙述了,最后突发奇,做了一步神奇操作搞定!
然后替换了个文件
在JAVA_HOME/lib/security/cacerts文件,这个文件主要是JDK用来储存证书的一个仓库,包括自身信任的证书和keytool导入的一些证书,然后我用orecle的cacerts证书替换掉了服务器上openJDK的同一路径下的同名文件,OK,搞定!
问题估计
通过keytool -list -keystore cacerts命令查看两个文件,发现orecleJDK的日期都是毫无规律的,而且日期都比较久了,而openJDK的日期都是2021年的,不知道会不会和这个问题有关系,目前遇到了,先记一下,备忘。