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即可:
- 添加依赖(Gradle示例)
implementation("org.apache.httpcomponents.client5:httpclient5") implementation("org.springframework.vault:spring-vault-core:3.0.0")
- 在你的
AbstractVaultConfiguration子类里,重写clientHttpRequestFactory()方法指定使用Apache的实现:
override fun clientHttpRequestFactory(): ClientHttpRequestFactory { return HttpComponentsClientHttpRequestFactory(HttpClients.createDefault()) }
这时候你原来写的sslConfiguration()代码就能正常工作,无需修改。
办法2:给JDK HttpClient配置自定义SSLContext(推荐新版本适配)
如果想沿用官方默认的JDK HttpClient,就得手动把自签名CA证书加载到SSLContext中,再传给Vault的请求工厂:
- 编写工具方法将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 }
- 重写
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
相关产品推荐
相关产品推荐

