You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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里尝试排查方案二的问题:

  1. 用以下命令启动服务并查看信任库信息:
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

  1. 换成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

  1. 我还尝试把证书导入到系统默认的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:03:03