IDE 链接wss 或者https 证书认证不过去的问题总结
主要错误 :
Caused by: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty at java.base/sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:89) at java.base/sun.security.validator.Validator.getInstance(Validator.java:181) at java.base/sun.security.ssl.X509TrustManagerImpl.getValidator(X509TrustManagerImpl.java:330) at java.base/sun.security.ssl.X509TrustManagerImpl.checkTrustedInit(X509TrustManagerImpl.java:180) at java.base/sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:192) at java.base/sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:133) at java.base/sun.security.ssl.ClientHandshaker.checkServerCerts(ClientHandshaker.java:1825) at java.base/sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1655) at java.base/sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:260) at java.base/sun.security.ssl.Handshaker.processLoop(Handshaker.java:1086) at java.base/sun.security.ssl.Handshaker.processRecord(Handshaker.java:1020) at java.base/sun.security.ssl.SSLSocketImpl.processInputRecord(SSLSocketImpl.java:1137) at java.base/sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1074) at java.base/sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973) at java.base/sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1402) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1429) ... 25 common frames omitted
原因分析1. 与jdk ide 有关 ide 在设置jdk 的时候 会加载 该jdk 目录下面的 证书文件 (路劲位置为 %JAVA_HOME%/jre/lib/security/cacerts)
该文件加载过了 会在ide 里面记住 因为之前我设置了 一直没有好使 但是当我增加了 目标网站信任的证书后 在切换到其他的jdk 还是可以的 因此得出以上结论。
原因分析2. 与系统设置有关 具体在哪不详 得出以上结论是因为 我们公司 好几个人的ide 以及JDK 没有做任何设置都是正常的 都是1.8 的大版本我的小版本号都比他们的高 也不行。
原因分析3. 与JDK 的厂商有关 我使用的是 OpenJDK 他们使用的可能是 oracle 厂商。
以上是我对该文档分析。
我的解决方案:
1. 首先换了 高版本的jdk 有不行 然后又升级了 新版本的ide 也不行。
2. 检查本地的jdk 下面确实有对应的 证书文件 里面也有相关100 多个证书。
3. 增加目标网站上的证书到自己的jdk (这一步做完后从新编译项目 就好了)
以下是我增加证书的方法和步骤:
1. 找到目标网站 点击安全标识
然后下步 默认选项就行保存好然后 复制到 jdk下面的jre/bin 目录里面
如上图所示
执行以下命令
keytool -import -v -trustcacerts -alias okexssl -file okexssl.cer -storepass changeit -keystore %JAVA_HOME%/jre/lib/security/cacerts
确认就行
说明: changeit 是密码, java默认。 keytool.exe是在 %JAVA_HOME%/jre/bin/目录下的,jdk默认自带。 cacerts是文件(即将要把证书导入到其中的文件),在 %JAVA_HOME%/jre/lib目录 keytool命令的 -ketstore参数 跟着的密钥库名称要加上双引号。 是否信任此证书? [否]:" ,那么请输入"y"。
其他相关命令
查看证书列表命令
keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit
删除证书命令 (该命令没有尝试过网上拷贝) keytool -import -alias 文件名 -file 文件名.cer -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit-trustcacerts
导入证书命令
keytool -import -v -trustcacerts -alias okexssl -file okexssl.cer -storepass changeit -keystore %JAVA_HOME%/jre/lib/security/cacerts
这些做完后从新设置ide 的jre 让其从新编译应该就行了 至少我的好了
顺便说下 ide 的设置
该位置每次从新切换会从新编译 等待一会就好了
得出上面原因分析1 的结论是因为我从新换回我之前没有添加证书的那个 jdk 他也是可以建立链接也不报错 ,只要有一次添加了 刚刚添加证书那个jdk 启动成功后面怎么换都不会有问题。
以上是我总结的欢迎大家评论