Spring Boot中通过SSL连接Redis时如何配置有效证书路径?
Redis SSL连接PKIX路径错误解决方案
错误原因
你遇到的PKIX path building failed错误,本质是JVM的默认信任库不包含Redis服务器的SSL证书test.pem,导致SSL握手时无法验证证书有效性。
两种配置方案
方案1:通过application.yml配置(需转换证书格式)
- 转换PEM证书为PKCS12格式
用OpenSSL命令把test.pem转成通用的PKCS12格式(执行时会要求设置密码,记好这个密码):openssl pkcs12 -export -in test.pem -out redis-cert.p12 -name "redis-cert" - 放置证书并配置application.yml
把转换后的redis-cert.p12放到项目resources目录下,然后在application.yml中添加配置:spring: redis: ssl: true # 基础连接信息(主机、端口、密码按需补充) host: XXX port: XXX password: XXX lettuce: ssl: trust-store: classpath:redis-cert.p12 trust-store-type: PKCS12 trust-store-password: 你设置的PKCS12密码
方案2:Java代码配置(直接加载PEM证书)
如果不想转换证书格式,直接自定义Redis连接工厂加载PEM证书:
- 确保
test.pem在resources目录下,创建配置类:import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import io.lettuce.core.ClientOptions; import io.lettuce.core.SslOptions; import io.lettuce.core.SslVerifyMode; import java.io.IOException; import java.io.InputStream; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; @Configuration public class RedisSslConfig { @Bean public LettuceConnectionFactory redisConnectionFactory() throws IOException, CertificateException { // 配置Redis基础连接信息 RedisStandaloneConfiguration redisConfig = new RedisStandaloneConfiguration(); redisConfig.setHostName("你的Redis主机"); redisConfig.setPort(你的Redis端口); // 有密码的话打开下面注释 // redisConfig.setPassword("你的Redis密码"); // 加载resources下的test.pem证书 CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); try (InputStream certStream = getClass().getResourceAsStream("/test.pem")) { X509Certificate cert = (X509Certificate) certFactory.generateCertificate(certStream); // 配置SSL选项 SslOptions sslOptions = SslOptions.builder() .trustManager(cert) .verifyMode(SslVerifyMode.FULL) // 生产环境建议用FULL严格验证 .build(); ClientOptions clientOptions = ClientOptions.builder() .sslOptions(sslOptions) .build(); // 构建Lettuce客户端配置 LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder() .useSsl() .clientOptions(clientOptions) .build(); return new LettuceConnectionFactory(redisConfig, clientConfig); } } }
测试环境临时方案(不推荐生产)
如果是测试环境,也可以临时关闭证书验证来绕过错误,但会降低安全性:
在application.yml中添加:
spring: redis: lettuce: ssl: verify-hostname: false
内容的提问来源于stack exchange,提问作者Alchemisz
相关产品推荐
相关产品推荐

