【问题标题】:Unable to connect to Redis in GCP which is SSL Enabled无法连接到启用 SSL 的 GCP 中的 Redis
【发布时间】:2021-10-20 10:43:30
【问题描述】:

我正在使用Spring-boot-starter-redis依赖连接到redis(下面是我从gradle依赖的sn-p

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    compileOnly 'org.projectlombok:lombok:1.18.20'
    annotationProcessor 'org.projectlombok:lombok:1.18.20'
}

我现在要迁移到 GCP,并且 GCP 中的 redis 已启用 SSL,因此,我以这种方式配置了我的 spring 属性

spring.redis.ssl=true
spring.redis.host=xxxxxx
spring.redis.port=6378

当我禁用 ssl 时它工作得很好。但是当我启用它时,我得到以下错误..有没有办法在 Spring 配置中注入 PEM 证书?

[Request processing failed; nested exception is org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to xx.xx.xx.xx:6378] with root cause
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at java.base/sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) ~[na:na]
        at java.base/sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) ~[na:na]
        at java.base/java.security.cert.CertPathBuilder.build(CertPathBuilder.java:297) ~[na:na]
        at java.base/sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:434) ~[na:na]
        at java.base/sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:306) ~[na:na]
        at java.base/sun.security.validator.Validator.validate(Validator.java:264) ~[na:na]
        at java.base/sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:313) ~[na:na]
        at java.base/sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:276) ~[na:na]
        at java.base/sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:141) ~[na:na]
        at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.checkServerCerts(CertificateMessage.java:1334) ~[na:na]
        at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.onConsumeCertificate(CertificateMessage.java:1231) ~[na:na]
        at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.consume(CertificateMessage.java:1174) ~[na:na]
        at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392) ~[na:na]
        at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:443) ~[na:na]
        at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1074) ~[na:na]
        at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1061) ~[na:na]
        at java.base/java.security.AccessController.doPrivileged(Native Method) ~[na:na]
        at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask.run(SSLEngineImpl.java:1008) ~[na:na]

请帮忙

【问题讨论】:

  • 我认为问题在于您的客户端正在验证 Redis 的 SSL 证书并且失败了。如果您使用的是自托管 Redis、Cloud MemoryStore 或 Redis Enterprise,您的问题并不清楚。
  • 我正在使用云内存存储
  • 我建议您将其中一个标签更改为 google-cloud-memorystore

标签: spring-boot google-cloud-platform redis spring-data-redis google-cloud-memorystore


【解决方案1】:

我是这样解决的

  • spring-boot-starter-data-redis 依赖默认使用 Lettuce
  • 要通过 ssl spring.redis.ssl=true 属性连接到 Redis,需要启用。
  • 如果证书的 CA 是唯一的并且不是 Java 的 JKS 的一部分,那么您有两个选择,将密钥导入 JKS 或禁用 SSL-Verification

引用Google Docs here中给出的内容

例如,Lettuce 是 Redis 的流行 Java 客户端。他们的文档提供了一个使用 TLS 进行本地连接的示例(参见示例 47)。鉴于 Java 安全管理器默认不允许自签名证书,因此需要在 Redis URI 构造中指定一个附加选项.withVerifyPeer(false)

我禁用了 SSL Verification 。连接仍将通过 SSL 进行,但仅验证我通过配置 bean 将其禁用。

我也不担心man-in-the-middle-attack,因为我的 Redis 只暴露给我的 GKE 集群。所以这个解决方案对我来说很好

@Configuration
public class RedisSSLConfiguration {

    @Bean
    @ConditionalOnProperty("spring.redis.ssl")
    public LettuceClientConfigurationBuilderCustomizer builderCustomizer() {
        return builder -> builder.useSsl().disablePeerVerification();
    }
}

【讨论】:

    猜你喜欢
    • 2020-04-02
    • 2021-03-08
    • 2015-09-22
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 2023-02-10
    • 2014-12-31
    相关资源
    最近更新 更多