Spring Boot微服务使用自签名SSL证书时遭遇SSLPeerUnverifiedException及trustAnchors参数为空异常的问题求助
Spring Boot微服务使用自签名SSL证书时遭遇SSLPeerUnverifiedException及trustAnchors参数为空异常的问题求助
各位好,我目前在维护一套基于Java Spring Boot的微服务系统,自己生成了自签名SSL证书来启用HTTPS,但遇到了两个棘手的问题,想请大家帮忙分析下:
自签名SSL证书生成步骤
我是按照以下方式生成并存储自签名SSL证书的:
配置文件 sub.conf
[req] default_bits = 4096 prompt = no default_md = sha256 x509_extensions = v3_req distinguished_name = dn [dn] C = IN ST = MAH L = PUNE O = JAM emailAddress = Domino.Admin@jam.com CN = it+ [v3_req] subjectAltName = @alt_names [alt_names] DNS.1 = localhost
生成命令
# 非交互式生成,有效期10年 openssl.exe req -new -x509 -newkey rsa:4096 -sha256 -nodes -keyout ".\key.pem" -days 3560 -out ".\crt.pem" -config ".\sub.conf" # 创建PKCS12格式的密钥库 openssl pkcs12 -inkey .\key.pem -in .\crt.pem -export -out .\myapp.p12 # 创建JKS格式的信任库 keytool -importkeystore -srckeystore myapp.p12 -srcstoretype pkcs12 -destkeystore myapp.jks -deststoretype JKS
方案一:能运行但服务端出现异常日志
我先尝试了以下配置,客户端和服务端能正常运行,但服务端部署日志里会出现一段异常,虽然最终请求还是被正常处理了:
客户端 application.yml
# ============================================================== # = Authentication Server JWT # ============================================================== server: port: 9100 ssl: enabled: true trust-store: E:\myapp.p12 # 证书所在的密钥库路径 trust-store-password: <tspwd> trust-store-type: PKCS12 bundle: "mybundle" spring: application: name: AUTH-SERVICE ssl: bundle: pem: mybundle: keystore: certificate: "/crt.pem" private-key: "/key.pem" truststore: certificate: "/crt.pem"
服务端 application.yml
server: port: 5000 ssl: enabled: true key-store: E:\myapp.p12 # 证书所在的密钥库路径 key-store-password: <kspwd> key-store-type: PKCS12 trust-store: E:\myapp.jks # 信任库路径 trust-store-password: <tspwd> trust-store-type: JKS bundle: "mybundle" spring: application: name: GestUser ssl: bundle: pem: mybundle: keystore: certificate: "/crt.pem" private-key: "/key.pem" truststore: certificate: "/crt.pem"
服务端异常日志
o.s.security.web.FilterChainProxy : Securing GET /api/utenti/cerca/userid/anonymous o.a.tomcat.util.net.jsse.JSSESupport : Error trying to obtain a certificate from the client javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated o.s.security.web.FilterChainProxy : Secured GET /api/utenti/cerca/userid/anonymous
虽然最终请求被正常处理了,但这段异常日志让我很疑惑,想搞清楚原因并解决它。
方案二:服务端完全无法启动,抛出trustAnchors参数为空异常
后来我尝试了另一种配置方式,结果服务端直接启动失败,抛出以下异常:
客户端 application.yml(SSL部分)
ssl: bundle: jks: mybundle: key: alias: "1" keystore: location: "/myapp.p12" password: <kspwd> type: "PKCS12"
服务端 application.yml(SSL部分)
ssl: bundle: jks: mybundle: key: alias: "1" keystore: location: "/myapp.p12" password: <kspwd> type: "PKCS12" truststore: location: "/myapp.jks" password: <tspwd> type: "JKS"
启动异常
LifecycleException: Protocol handler start failed Caused by: java.lang.IllegalArgumentException: the trustAnchor parameter must be non-empty Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
调试尝试(Windows WSL子系统)
我在WSL里尝试排查方案二的问题:
- 用以下命令启动服务并查看信任库信息:
java -Djavax.net.debug=all -Djavax.net.ssl.trustStore=/mnt/e/myapp.p12 -Djavax.net.ssl.trustStorePassword=<pwd> -jar ./target/gestuser-0.0.1-SNAPSHOT.jar https://localhost 2>&1 | grep -i truststore
输出显示:trustStore type is: pkcs12,同时还有 TrustStoreManager.java:346|Reloaded 1 trust certs
- 换成JKS格式的信任库再次尝试:
java -Djavax.net.debug=all -Djavax.net.ssl.trustStore=/mnt/e/myapp.jks -Djavax.net.ssl.trustStorePassword=<pwd> -jar ./target/gestuser-0.0.1-SNAPSHOT.jar https://localhost 2>&1 | grep -i truststore
输出同样显示:trustStore type is: pkcs12,也有 TrustStoreManager.java:346|Reloaded 1 trust certs
- 我还尝试把证书导入到系统默认的cacerts信任库:
sudo keytool -import -alias myserver -keystore $JAVA_HOME/lib/jvm/java-21-openjdk-amd64/lib/security/cacerts -file /mnt/e/crt.pem
然后用以下命令启动:
java -Djavax.net.ssl.trustStore=$JAVA_HOME/lib/jvm/java-21-openjdk-amd64/lib/security/cacerts -Djavax.net.ssl.trustStorePassword=changeit -jar ./target/gestuser-0.0.1-SNAPSHOT.jar https://localhost
结果还是抛出同样的 trustAnchors parameter must be non-empty 异常,真的快愁死了...
希望各位大佬能帮我分析下这两个问题:
- 方案一里的
SSLPeerUnverifiedException是什么原因?为什么请求最终还能正常处理? - 方案二里的
trustAnchors parameter must be non-empty异常该怎么解决?我已经确认信任库是有证书的,为什么还是报这个错?
备注:内容来源于stack exchange,提问作者Stefano Giammori
相关产品推荐
相关产品推荐

