通过StackExchange与Redis建立SSL连接,

fdbelqdn  于 2022-11-14  发布在  Redis
关注(0)|答案(3)|浏览(242)

我有一个非常奇怪的问题与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”方法来提供客户端证书。

irtuqstp

irtuqstp1#

您可以尝试使用CertificateValidation来验证证书。我尝试了以下代码,它对我很有效:

options.CertificateValidation += ValidateServerCertificate;

...

public static bool ValidateServerCertificate(
        object sender,
        X509Certificate certificate,
        X509Chain chain,
        SslPolicyErrors sslPolicyErrors)
    {
        if (sslPolicyErrors == SslPolicyErrors.None)
            return true;

        Console.WriteLine("Certificate error: {0}", sslPolicyErrors);

        return false;
    }
shstlldc

shstlldc2#

在这样的情况下,您使用的是客户端证书,它在控制台应用程序中工作,但在其他应用程序中不工作(您没有说,但我猜是来自IIS托管的Web应用程序),它几乎总是与帐户是否有权访问私钥有关。
控制台应用程序使用您的帐户运行,该帐户可能可以访问私钥。
给予帐户访问权限
1.打开本地计算机证书存储
1.查找您客户端证书
1.右键单击并选择“所有任务-〉管理验证密钥...”
1.单击“添加...”并添加帐户。
注意:如果添加IIS应用程序池帐户,则格式为:IIS APPPOOL〈我的应用程序集区名称〉
位置应该是本地计算机而不是域。

jhdbpxl9

jhdbpxl93#

我可以用下面的代码对我在虚拟机上启动的Redis服务器进行ssl。add stackexchange.redis Visual Studio

try
        {
            ConfigurationOptions configurationOptions = new ConfigurationOptions
            {
                KeepAlive = 0,
                AllowAdmin = true,
                EndPoints = { { "SERVER IP ADDRESS", 6379 }, { "127.0.0.1", 6379 } },
                ConnectTimeout = 5000,
                ConnectRetry = 5,
                SyncTimeout = 5000,
                AbortOnConnectFail = false,
            };
            configurationOptions.CertificateSelection += delegate
            {
                var cert = new X509Certificate2("PFX FILE PATH", "");
                return cert;
            };
            ConnectionMultiplexer connection =
                  ConnectionMultiplexer.Connect(configurationOptions);
            IDatabase databaseCache = connection.GetDatabase();
            //set value
            databaseCache.StringSet("KEYNAME", "KEYVALUE");
            //get Value
            label_show_value.Text = databaseCache.StringGet("KEYNAME").ToString();
        }
        catch (Exception e1)
        {
        }

相关问题