目录
1、问题现场
因需要部署SpringBoot项目到合作厂商的云服务器上,项目因为调用公司内容其他业务的接口上传Scorm文件。为保障能够正常使用,重点验证了调用了第三方接口功能是否正常。
结果发现调用第三方接口出现问题,无法上传Scorm文件。开始定位为第三方服务问题,让服务提供方进行跟踪排查。因为本功能在现有线上是正常的。具体报错如下:
2021-05-08 04:52:35.055 [http-nio-8080-exec-7]
ERROR com.***.RestTemplateUtils - I/O error on POST request for "https://raas-api.uat.***.com/auth/oauth/token":
Unexpected error: java.security.InvalidAlgorithmParameterException:
the trustAnchors parameter must be non-empty;
nested exception is javax.net.ssl.SSLException: Unexpected error: java.security.InvalidAlgorithmParameterException:
the trustAnchors parameter must be non-empty
2、定位问题
2.1 、表象的迷惑
springboot使用TestRestTemplate单元测试时,提示ResourceAccess I/O error on POST request for "http
发现如果后台的http状态码返回401则会出现这种情况(其他4XX等可能也会)
提供的解决方案:
解决方案,pom.xml加入
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<scope>test</scope>
</dependency>
此种方案加入后还是继续出现前面的问题。此种方案失效。
2.2、问题的本质
- 本人的java服务是以jar包的形式运行在linux环境中
- 当程序中使用HTPPS调用第三方接口时候报这个错误
- 原因是因为安装的jdk中jre的以来有问题、没有ssl支持的相关证书包
最后搜索找到一个十分相似的文章说明此问题的根源在于此(有问题的jdk/lib目录(缺少其他依赖))。
最后让运维重新安装一个新的jdk。
3、查找安装jdk路径
我安装完jdk太久没用忘记安装路径了,下面记录一下找jdk的安装路径
- which java
- ls -lrt /usr/bin/java
- ls -lrt /etc/alternatives/java
最后就出来了
4、总结
发现文件一定需要先根据出错的异常进行定位,特别是关键信息,如本问题的关键信息如下:
nested exception is javax.net.ssl.SSLException: Unexpected error: java.security.InvalidAlgorithmParameterException:
the trustAnchors parameter must be non-empty
5、参考文章
springboot使用TestRestTemplate单元测试时,提示ResourceAccess I/O error on POST request for "http