SSL-соединение с Redis с помощью StackExchange.Redis - PullRequest
0 голосов
/ 30 сентября 2019

У меня очень странная проблема с StackExchange.Redis для подключения к Redis.

Я включил SSL в базе данных Redis и не могу подключиться от клиента к серверу Redis с помощью SSL-сертификата с кодом ниже.

  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 с указанным выше кодом, я могу подключиться, но если я использовал тот же код из своего веб-приложения для подключения к redis, то я невозможность подключения.

Не уверен, что я что-то упустил.

Кроме того, я прошел через "mgravell" post

В этом посте он имеетнастроенный метод " CertificateValidation ", в моем сценарии я хочу, чтобы Redis проверял сертификат SSL. поэтому у меня нет проверки реализации. И внедрил метод CertificateSelection для предоставления клиентского сертификата.

1 Ответ

0 голосов
/ 16 октября 2019

Вы можете попытаться подтвердить сертификат, используя 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;
    }
...