Подключение AWS cassandra с помощью c# - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь подключиться к AWS Cassandra, используя этот код:

       var pathToCAFile = $"{Directory.GetCurrentDirectory()}/AmazonRootCA1.pem";
        X509Certificate2[] certs = new X509Certificate2[] { new X509Certificate2(pathToCAFile, "amazon") };
        X509Certificate2Collection certificateCollection = new X509Certificate2Collection(certs);
        var options = new Cassandra.SSLOptions(SslProtocols.Tls11, true, ValidateServerCertificate);
        options.SetCertificateCollection(certificateCollection);
        Cluster cluster = Cluster
                            .Builder()
                            .WithCredentials("username", "password")
                            .WithPort(9142)
                            .AddContactPoint("cassandra.us-east-1.amazonaws.com")
                           .WithSSL()
                            .WithLoadBalancingPolicy(new DefaultLoadBalancingPolicy("us-east-1"))
                            .Build();

        // Connect to the nodes using a keyspace
        var session = cluster.Connect("system_distributed");

        // Execute a query on a connection synchronously
        var rs = session.Execute("select * from system.peers");

Вот ошибка, которую я получаю:

"Cassandra.NoHostAvailableException: 'Все узлы, которые пытались выполнить запрос, завершились неудачно (попытка 3.83.169.143:9142: AuthenticationException' Удаленный сертификат недействителен в соответствии с процедурой проверки. ')'

Это Изначально в стеке вызовов было сгенерировано исключение:

Cassandra.Connections.Control.ControlConnection.Connect (bool) System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonon (System.Threading.Tasks.Task) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task) System. 1019 * () System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw ( ) System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.TaskAwaiterNotification (System.Threading.Tasks.Task). ... [Стек вызовов усечен]

1 Ответ

2 голосов
/ 26 мая 2020

Я полагаю, вы используете драйвер DataStax C#. Если это так, есть этот раздел документации по SSL / TLS, в котором также есть ссылки на несколько примеров: https://docs.datastax.com/en/developer/csharp-driver/3.15/features/tls/

Если этот фрагмент точен, вы на самом деле не устанавливаете SSLOptions по методу Builder.WithSSL().

Если это не сработает и примеры кода вам не помогут, покажите нам метод ValidateServerCertificate, чтобы мы могли увидеть, что может быть не так при проверке сертификата.


Изменить (из моего комментария ниже):

На странице документации TLS / SSL есть соответствующий раздел: Включение аутентификации сервера с помощью пользовательского root сертификат .

Как упоминалось в документации, вам необходимо либо установить этот сертификат на машине, на которой работает приложение, либо предоставить настраиваемый валидатор сертификатов, подобный этому .

Метод SSLOptions.SetCertificateCollection() используется для аутентификации клиента, поэтому он бесполезен в вашей ситуации, когда вам нужна аутентификация сервера.

...