【问题标题】:Docker Redis TLS authentication failure with .netcore app.netcore 应用程序的 Docker Redis TLS 身份验证失败
【发布时间】:2021-05-07 13:11:49
【问题描述】:

我正在尝试将 redis 与 tls 与 netcore 应用程序一起使用,但出现身份验证错误

设置:

码头工人:

我使用 redis:6.2.0 创建了一个 redis docker 容器

docker-compose.yaml:

.
.
redis:
    image: redis:6.2.0
    command: redis-server /usr/local/etc/redis/redis.conf --appendonly yes
    container_name: "cxm-redis"
    ports:
     - "6379:6379"
    volumes:
      - cxm-redis-data:/data
      - C:/SaaS/certs/redis.conf:/usr/local/etc/redis/redis.conf
      - C:/SaaS/certs/tests/tls/redis.crt:/usr/local/etc/redis/redis.crt
      - C:/SaaS/certs/tests/tls/redis.key:/usr/local/etc/redis/redis.key
      - C:/SaaS/certs/tests/tls/ca.crt:/usr/local/etc/redis/ca.crt

到目前为止,一切看起来都不错,(据我所知)我设法使用以下命令进行了身份验证 redis-cli --tls --cert ../usr/local/etc/redis/redis.crt --key /usr/local/etc/redis/redis.key --cacert /usr/local/etc/redis/ca.crt 我可以成功 ping 并请求密钥。

我使用 openssl 创建了证书,对于 redis.conf 我使用的是redis.conf example from redis

重要的部分:

### TLS
tls-port 6379
tls-cert-file /usr/local/etc/redis/redis.crt
tls-key-file /usr/local/etc/redis/redis.key
tls-ca-cert-file /usr/local/etc/redis/ca.crt

网核:

对于我的 .netcore 应用程序,我使用的是 StackExchange 库,对于 TLS 连接,我遵循 instructions here,就像这样

var options = new ConfigurationOptions
{
    EndPoints = { "redis-test:6379" },
    Password = "not-the-actual-password",
    Ssl = true
};
options.CertificateSelection += delegate {
    return new X509Certificate2("./redis_certificate.p12");
};
_db = ConnectionMultiplexer.Connect(options).GetDatabase();

redis_certificate.p12 是使用 openssl 和这个命令行生成的 openssl pkcs12 -export -out sample_certificate.p12 -inkey redis.key -in redis.crt

问题:

当我从我的应用程序向 redis 发出请求时,我收到以下错误:

无法连接到 redis 服务器。身份验证失败;检查密码(或客户端证书)是否配置正确。 redis-test 上的 AuthenticationFailure:6379/Interactive, Initializing/NotStarted 在我的应用程序日志中,我在我的 redis 日志中得到以下信息:

  • 接受客户端连接时出错:error:1408F10B:SSL routines:ssl3_get_record:wrong version number
  • 接受客户端连接时出错:错误:14094418:SSL 例程:ssl3_read_bytes:tlsv1 alert unknown ca,
  • 接受客户端连接时出错:(null)

在我的设置中是否有任何我看不到的明显错误?这是我第一次尝试这个,也许我假设太多或走错路了..

尝试解决此问题时,我发现了几个具有类似问题的问题,但实施他们的修复并没有解决我的问题..

我尝试过的一些事情

  • 从我的 .netcore 应用程序发送不同的 ssl 协议
  • 以不同方式发送 pfx/p12 证书
  • 几种不同的 redis 配置

编辑:我可以根据需要提供尽可能多的代码!

【问题讨论】:

    标签: docker ssl .net-core redis


    【解决方案1】:

    对于任何面临相同问题的人,似乎服务器使用非路由 CA 来获取服务器证书,我找到的解决方案是使用 StackExchange.Redis 库的 CertificateValidation 回调和以下代码

    private static bool CheckServerCertificate(object sender, X509Certificate certificate,
       X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        if ((sslPolicyErrors & SslPolicyErrors.RemoteCertificateChainErrors) == SslPolicyErrors.RemoteCertificateChainErrors)
        {
            // check that the untrusted ca is in the chain
            var ca = new X509Certificate2(_redisSettings.CertificatePath);
            var caFound = chain.ChainElements
                .Cast<X509ChainElement>()
                .Any(x => x.Certificate.Thumbprint == ca.Thumbprint);
    
            return caFound;
        }
        return false;
    }
    

    也是代码的重要部分是条件

    if((sslPolicyErrors & SslPolicyErrors.RemoteCertificateChainErrors) == SslPolicyErrors.RemoteCertificateChainErrors)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-28
      • 2016-11-14
      • 1970-01-01
      • 2019-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多