升级Spring Boot3.0.0+JDK17后PubSub主题发布失败求助
解决Spring Boot 2.5+(含3.0.0)+ JDK17下GCP PubSub发布的PKIX证书路径问题
问题分析
Spring Boot 2.5及以上版本(含3.0.0)搭配JDK17时,GCP PubSub发布主题出现PKIX path building failed错误,核心原因是:
- 新版Spring Cloud GCP客户端库对SSL证书验证逻辑更严格
- JDK17默认信任根证书存储可能未包含GCP PubSub服务端的CA证书
- Spring Boot 2.2使用的旧版客户端库采用了不同的证书信任策略,因此可以正常工作
解决方案
1. 将GCP PubSub CA证书导入JDK信任库
这是生产环境推荐的方案,确保JDK信任PubSub的服务端证书:
- 执行以下命令导出PubSub的CA证书:
openssl s_client -connect pubsub.googleapis.com:443 < /dev/null | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' > pubsub.crt - 将证书导入JDK默认信任库(默认密码为
changeit):
注意:确保操作的是项目实际使用的JDK版本对应的keytool -importcert -file pubsub.crt -alias pubsub-ca -keystore $JAVA_HOME/lib/security/cacertscacerts文件。
2. 配置Spring Boot使用自定义信任存储
如果无法修改JDK全局信任库,可以在项目中配置自定义信任存储:
- 先创建包含PubSub CA证书的JKS信任库:
keytool -importcert -file pubsub.crt -alias pubsub-ca -keystore pubsub-truststore.jks -storepass your-custom-password - 将
pubsub-truststore.jks放入项目src/main/resources目录 - 在
application.properties中添加配置:spring.cloud.gcp.pubsub.publisher.ssl.trust-store=classpath:pubsub-truststore.jks spring.cloud.gcp.pubsub.publisher.ssl.trust-store-password=your-custom-password
3. 确认GCP客户端库版本兼容性
Spring Boot 3.0.0需要搭配Spring Cloud GCP 4.0.x版本,避免版本不匹配导致的证书处理异常:
- Maven依赖配置:
<dependency> <groupId>com.google.cloud</groupId> <artifactId>spring-cloud-gcp-starter-pubsub</artifactId> <version>4.0.0</version> </dependency> - Gradle依赖配置:
implementation 'com.google.cloud:spring-cloud-gcp-starter-pubsub:4.0.0'
4. 测试环境临时绕过证书验证(生产禁用)
仅在测试环境下可临时跳过证书验证,绝对不能用于生产:
- 创建自定义SSL上下文配置类:
import io.netty.handler.ssl.SslContext; import io.netty.handler.ssl.SslContextBuilder; import io.netty.handler.ssl.util.InsecureTrustManagerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class PubSubSslConfig { @Bean public SslContext pubSubSslContext() throws Exception { return SslContextBuilder.forClient() .trustManager(InsecureTrustManagerFactory.INSTANCE) .build(); } } - 配置PubSub模板使用该SSL上下文(需结合Spring Cloud GCP的客户端配置扩展)
内容的提问来源于stack exchange,提问作者Lakshmi Ganeshan
相关产品推荐
相关产品推荐

