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

Spring Boot3升级后Spring Vault无法验证自签名CA证书问题

Spring Boot3 + Spring Vault3 自签名CA证书验证修复方案

问题根源

Spring Vault 3.0.x 起默认改用JDK原生HttpClient,而你之前通过AbstractVaultConfiguration.sslConfiguration()配置SSL的方式,只对旧版本默认的Apache HttpClient生效。日志里的警告已经明确提示:用JDK HTTP client的话,SSL配置得在Vault客户端外部完成,原来的配置路径不再适用,这才导致PKIX路径构建失败。

两种解决办法

办法1:切回Apache HttpClient(适配原有配置)

要是不想大改代码,直接强制Spring Vault用回Apache HttpClient即可:

  1. 添加依赖(Gradle示例)
implementation("org.apache.httpcomponents.client5:httpclient5")
implementation("org.springframework.vault:spring-vault-core:3.0.0")
  1. 在你的AbstractVaultConfiguration子类里,重写clientHttpRequestFactory()方法指定使用Apache的实现:
override fun clientHttpRequestFactory(): ClientHttpRequestFactory {
    return HttpComponentsClientHttpRequestFactory(HttpClients.createDefault())
}

这时候你原来写的sslConfiguration()代码就能正常工作,无需修改。

办法2:给JDK HttpClient配置自定义SSLContext(推荐新版本适配)

如果想沿用官方默认的JDK HttpClient,就得手动把自签名CA证书加载到SSLContext中,再传给Vault的请求工厂:

  1. 编写工具方法将CA证书转换为TrustManager
private fun createTrustManager(caPemBytes: ByteArray): X509TrustManager {
    val certFactory = CertificateFactory.getInstance("X.509")
    val caCert = certFactory.generateCertificate(ByteArrayInputStream(caPemBytes)) as X509Certificate

    val trustStore = KeyStore.getInstance(KeyStore.getDefaultType())
    trustStore.load(null, null)
    trustStore.setCertificateEntry("vault-ca", caCert)

    val tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
    tmf.init(trustStore)

    return tmf.trustManagers.first { it is X509TrustManager } as X509TrustManager
}
  1. 重写clientHttpRequestFactory()方法,配置JDK HttpClient使用自定义SSLContext:
override fun clientHttpRequestFactory(): ClientHttpRequestFactory {
    val caPemBytes = Base64.getDecoder().decode(vaultCaPemBase64)
    val trustManager = createTrustManager(caPemBytes)

    val sslContext = SSLContext.getInstance("TLS")
    sslContext.init(null, arrayOf(trustManager), null)

    val httpClient = HttpClient.newBuilder()
        .sslContext(sslContext)
        .build()

    return JdkClientHttpRequestFactory(httpClient)
}

注意:此时不需要再重写sslConfiguration()方法,该配置对JDK HttpClient无效。

验证

启动应用后,之前的警告会消失,Vault连接时会使用你的自签名CA验证服务端证书,PKIX路径构建失败的问题也会解决。

内容的提问来源于stack exchange,提问作者Laurenzo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:10:30