Docker .netcore 应用的 Redis TLS 身份验证失败
Docker Redis TLS authentication failure with .netcore app
我正在尝试将 redis 与 tls 一起用于 netcore 应用程序,但出现身份验证错误
设置:
Docker:
我使用 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:6379/Interactive 上的 AuthenticationFailure,Initializing/NotStarted
在我的应用程序日志中,我在我的 redis 日志中得到以下内容:
- 接受客户端连接时出错:error:1408F10B:SSL routines:ssl3_get_record:wrong 版本号
- 接受客户端连接时出错:error:14094418:SSL routines:ssl3_read_bytes:tlsv1 警报未知 ca,
- 接受客户端连接时出错:(null)
我的设置中是否有任何我没有看到的明显错误?这是我第一次尝试这个,也许我假设太多或者走错了路..
在尝试解决这个问题时,我发现了几个具有类似问题的问题,但实施他们的修复并没有解决我的问题..
我试过的一些东西
- 从我的 .netcore 应用程序发送不同的 ssl 协议
- 以不同方式发送 pfx/p12 证书
- 几种不同的redis配置
编辑:我可以根据需要提供尽可能多的代码!
对于面临相同问题的任何人,似乎服务器正在使用非路由 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)
我正在尝试将 redis 与 tls 一起用于 netcore 应用程序,但出现身份验证错误
设置:
Docker:
我使用 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:6379/Interactive 上的 AuthenticationFailure,Initializing/NotStarted 在我的应用程序日志中,我在我的 redis 日志中得到以下内容:
- 接受客户端连接时出错:error:1408F10B:SSL routines:ssl3_get_record:wrong 版本号
- 接受客户端连接时出错:error:14094418:SSL routines:ssl3_read_bytes:tlsv1 警报未知 ca,
- 接受客户端连接时出错:(null)
我的设置中是否有任何我没有看到的明显错误?这是我第一次尝试这个,也许我假设太多或者走错了路..
在尝试解决这个问题时,我发现了几个具有类似问题的问题,但实施他们的修复并没有解决我的问题..
我试过的一些东西
- 从我的 .netcore 应用程序发送不同的 ssl 协议
- 以不同方式发送 pfx/p12 证书
- 几种不同的redis配置
编辑:我可以根据需要提供尽可能多的代码!
对于面临相同问题的任何人,似乎服务器正在使用非路由 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)