惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
J
Java Code Geeks
小众软件
小众软件
D
Docker
腾讯CDC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
V
V2EX
博客园 - 叶小钗
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
Stack Overflow Blog
Stack Overflow Blog
B
Blog RSS Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 【当耐特】
IT之家
IT之家
博客园 - 司徒正美
M
MIT News - Artificial intelligence
T
The Blog of Author Tim Ferriss
The GitHub Blog
The GitHub Blog
罗磊的独立博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志
C
Check Point Blog

热爱生活与梦想

迁移LeanCloud的Waline评论数据到TiDB/Neon 25年江浙地区暑假自驾游之感慨 使用阿里云灵码继续完成构建 SSL 证书管理器 亲手给儿子做的棒棒糖摩天轮六一礼物 使用腾讯云 CodeBuddy 构建 SSL 证书管理器 修复代码块默认高度相关缺陷 HugoNexT4.7.2 新功能和升级提示 改善代码块折叠和选中功能 支持Github风格的警告样式 新增音乐短代码功能支持 给文章添加摘要和过期提示功能 回顾24年的过去总结 修复Mathjax行内显示公式的问题 给Hugo文章增加阅读更多跳转的锚点定位功能 Win10隐匿的VPN设置和L2TP连接常见错误 Go语言中“糟糕”的日期时间格式化设计 DaoCloud道客提供的免费Docker镜像代理服务 感谢万能淘宝让自己吃到喜欢的美食 WSL运行时遇到未知异常错误无法使用 隐藏的换行符导致Base64加密解密失败 MySQL自带客户端直接免密登录操作 Linux系统中删除目录软链接的注意项 如何不关机重启WSL2恢复虚拟服务 在Windows上安装Podman容器平台做虚拟化 记一次无法弹出移动硬盘的记录 为友情链接添加自动检测脚本 重新激活Github的2FA认证 Linux中使用tar压缩命令排除文件 继续小米手环的健康生活之旅 一次意外的“坠机”引发了我对手机保护壳的深思
Java程序调用外网API时CA问题
凡梦星尘 · 2024-08-13 · via 热爱生活与梦想

前面在配置一个Java应用程序的API调用功能,可当启用此功能参数后,发现API调用没能成功,跟进下后台的日志报错信息,找到如下三行关键栈日志:

1
2
3
4
5
6
7
java.lang.RuntimeException: java.lang.RuntimeException: 
javax.net.ssl.SSLException: java.lang.RuntimeException: 
Unexpected errororithmParameterException: the trustAnchors parameter must be non-empty
Caused by: java.security.InvalidAlgorithmParameterException: 
the trustAnchors parameter must be non-empty
Caused by: java.lang.RuntimeException: Unexpected error: 
java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

原来以为会是常见的问题很容易解决,结果没有想到网上搜索出来的方案有很多而且操作也是比较复杂,然而并不想花费太多时间来验证,所以都没有采用直接就放弃啦。

重新思考可能发生的问题环节,回想起来当时构建Docker镜像的时候,使用的OpenJDK只是JRE解压版本(为了减小Docker镜像的大小),猜测大概是这个有相关的影响,找了其他非Docker环境下可正常运行的节点,首先是使用keytools命令检查了下其JDK里面的安全证书,参考如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts
输入密钥库口令: (直接回车键跳过)

*****************  WARNING WARNING WARNING  *****************
* 存储在您的密钥库中的信息的完整性  *
* 尚未经过验证!  为了验证其完整性, *
* 必须提供密钥库口令。                  *
*****************  WARNING WARNING WARNING  *****************

密钥库类型: JKS
密钥库提供方: SUN

您的密钥库包含 143 个条目

然后再切换回Docker环境中,检查了下解压版本JRE的安全证书,果然这里的密钥库是空的,但至于为何会是空的暂且不讨论,想的办法就是从系统中链接一个密钥库过去。正好使用的CentOS8的操作系统,找到自带的CA证书,直接创建个软链接过去,执行命令参考如下:

1
ln -sf /etc/pki/ca-trust/extracted/java/cacerts $JAVA_HOME/jre/lib/security/cacerts

然后再尝试重新启动Java应用程序,发现API调用服务是可以正常的开始工作啦,这不知道算不算一种幸运的解法。不管怎么说问题是成功解决,所以特此记录并分享一下。🎉

不过需要注意的是,上面提到的CA证书文件并不是所有Linux发行版本系统中默认存在,请根据自己系统的实际情况直接查找。另外也可尝试从其它类似环境中拷贝过来,但需要具体测试才知道能否使用。(亲测是可正常使用,但如果是生产环境得谨慎些。)