Spring Boot连接HTTPS Vault遇PKIX路径构建失败问题求助
Spring Boot应用连接HTTPS协议的Vault服务时,抛出以下SSL握手错误:
org.springframework.vault.authentication.VaultLoginException: Cannot log in using
org.springframework.web.client.ResourceAccessException: I/O error on POST request for "https://10.166.181.83:31975/v1/auth/cert/login":
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
依赖配置:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-vault-config</artifactId> </dependency>
bootstrap.properties配置:
spring.cloud.vault.scheme=https spring.cloud.vault.kv.enabled=true spring.cloud.vault.generic.enabled=true spring.cloud.vault.generic.backend=configuration-server spring.cloud.vault.generic.default-context=credentials spring.cloud.vault.connection-timeout=5000 spring.cloud.vault.read-timeout=15000 spring.cloud.vault.config.order=-10 spring.cloud.vault.authentication=CERT spring.cloud.vault.ssl.cert-auth-path=cert spring.cloud.vault.ssl.trust-store-location=classpath:vault.jks spring.cloud.vault.ssl.trust-store-password=ril@12345 management.endpoints.web.exposure.include=* management.endpoint.env.post.enabled=true spring.cloud.vault.uri=https://../../../ spring.cloud.vault.token=hvs.XXXXXXXX
注:连接本地HTTP协议的Vault服务时功能正常。
该错误核心是JVM无法信任Vault的SSL证书,导致PKIX证书路径构建失败,以下是具体排查和修复步骤:
验证信任库有效性
先确认vault.jks中是否包含Vault服务器的根证书/中间证书,执行命令检查:keytool -list -v -keystore vault.jks -storepass ril@12345如果未找到对应证书,将Vault的CA证书导入信任库:
keytool -import -alias vault-ca -file vault-ca.crt -keystore vault.jks -storepass ril@12345检查信任库路径配置
确保spring.cloud.vault.ssl.trust-store-location=classpath:vault.jks配置正确:vault.jks需放在项目src/main/resources目录下,打包后能被类路径加载;若使用外部文件,需改为绝对路径格式(如file:/opt/certs/vault.jks)。补全双向认证配置(若需)
因为采用CERT认证方式,若Vault开启双向认证,需补充客户端证书配置到bootstrap.properties:spring.cloud.vault.ssl.key-store-location=classpath:client.jks spring.cloud.vault.ssl.key-store-password=你的客户端密钥库密码同时确认Vault的
cert认证后端已启用,且客户端证书的DN已被授权访问Vault。排除系统级SSL配置冲突
检查是否存在JVM参数(如-Djavax.net.ssl.trustStore)覆盖了应用的信任库设置,如有需调整或移除该参数,确保应用使用自身配置的信任库。独立测试SSL连接
用curl测试与Vault的SSL连通性,验证证书本身有效性:curl --cacert vault-ca.crt https://10.166.181.83:31975/v1/sys/health若curl能正常返回健康状态,说明证书无问题,需重新排查应用端的信任库加载逻辑。
内容的提问来源于stack exchange,提问作者Zahid Akhtar

