我有一个非常奇怪的问题与StackExchange。Redis连接到Redis。
我已经在Redis数据库上启用了SSL,但我无法使用SSL证书从客户端连接到Redis服务器,代码如下。
static RedisConnectionFactory()
{
try
{
string connectionString = "rediscluster:13184";
var options = ConfigurationOptions.Parse(connectionString);
options.Password = "PASSWORD";
options.AllowAdmin = true;
options.AbortOnConnectFail = false;
options.Ssl = true;
options.SslHost = "HOSTNAME";
var certificate = GetCertificateFromThubprint();
options.CertificateSelection += delegate
{
return certificate;
};
Connection = new Lazy<ConnectionMultiplexer>(
() => ConnectionMultiplexer.Connect(options)
);
}
catch (Exception ex)
{
throw new Exception("Unable to connect to Cache Server " + ex);
}
}
public static ConnectionMultiplexer GetConnection() => Connection.Value;
public static IEnumerable<RedisKey> GetCacheKeys()
{
return GetConnection().GetServer("rediscluster", 13184).Keys();
}
// Find certificate based on Thumbprint
private static X509Certificate2 GetCertificateFromThubprint()
{
// Find certificate from "certificate store" based on thumbprint and return
StoreName CertStoreName = StoreName.Root;
string PFXThumbPrint = "NUMBER";
X509Store certLocalMachineStore = new X509Store(CertStoreName, StoreLocation.LocalMachine);
certLocalMachineStore.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certLocalMachineCollection = certLocalMachineStore.Certificates.Find(
X509FindType.FindByThumbprint, PFXThumbPrint, true);
certLocalMachineStore.Close();
return certLocalMachineCollection[0];
}
但是,如果我创建一个控制台应用程序,并使用上面的代码连接到Redis,那么我就可以连接,但是如果我使用我的Web应用程序中的相同代码连接到Redis,那么我就无法连接。
不确定我是否错过了什么。
还有我看了“mgravell”的帖子
在那篇文章中,他配置了“CertificateValidation”方法,在我的场景中,我想让Redis验证SSL证书。所以我没有实现验证。并实现了“CertificateSelection”方法来提供客户端证书。
3条答案
按热度按时间irtuqstp1#
您可以尝试使用CertificateValidation来验证证书。我尝试了以下代码,它对我很有效:
...
shstlldc2#
在这样的情况下,您使用的是客户端证书,它在控制台应用程序中工作,但在其他应用程序中不工作(您没有说,但我猜是来自IIS托管的Web应用程序),它几乎总是与帐户是否有权访问私钥有关。
控制台应用程序使用您的帐户运行,该帐户可能可以访问私钥。
给予帐户访问权限
1.打开本地计算机证书存储
1.查找您客户端证书
1.右键单击并选择“所有任务-〉管理验证密钥...”
1.单击“添加...”并添加帐户。
注意:如果添加IIS应用程序池帐户,则格式为:IIS APPPOOL〈我的应用程序集区名称〉
位置应该是本地计算机而不是域。
jhdbpxl93#
我可以用下面的代码对我在虚拟机上启动的Redis服务器进行ssl。add stackexchange.redis Visual Studio