Не удается подключиться к базе данных AWS с использованием TLS с проверкой CA сервера - PullRequest
0 голосов
/ 23 февраля 2019

Документация AWS гласит, что для подключения к моему кластеру DocumentDB мне нужно использовать строку запроса, которая заканчивается примерно так: ?ssl_ca_certs=rds-combined-ca-bundle.pem&replicaSet=rs0. Это цепочка корневых сертификатов , которую должен проверить мой клиент.Мне не нужно Сертификат клиента .

. Используя драйвер MongoDB C # и этот конкретный запрос, с файлом .pem в том же каталоге, я не могу установить соединение.Если я использую тот же файл .pem и строку запроса из оболочки Mongo, я могу правильно подключиться к своей базе данных.Он не работает только с моим основным приложением .net, которое также работает на AWS.

Удалив TLS из кластера и удалив опцию ssl_ca_certs из запроса, я могу правильно подключиться к своему кластеру.

Я думал, что смогу преобразовать свой .pem файл в .pfx, используя openssl, но я должен дать .pfx пароль и MongoDB документация гласит, что

Обязательно, чтобы при загрузке сертификата с паролем свойство PrivateKey не было нулевым.Если свойство имеет значение null, это означает, что ваш сертификат не содержит закрытого ключа и не будет передан на сервер.

Как использовать файл .pemпредоставляется Amazon AWS для подключения к моей базе данных с помощью драйвера C # MongoDB?

Ответы [ 5 ]

0 голосов
/ 26 апреля 2019

Вот примеры того, как программно подключиться к Amazon DocumentDB с C # (и другими драйверами) с включенным / отключенным TLS.

https://docs.aws.amazon.com/documentdb/latest/developerguide/connect.html

0 голосов
/ 09 марта 2019

Вот другой способ.Однако я обнаружил, что при использовании SSL с драйвером C # Mongo пул соединений не выполняется, и для каждого вызова открывается новое соединение.Вы можете уменьшить количество активных подключений, добавив MaxConnectionIdleTime, но это все равно не идеально, если ваше приложение создает много подключений.

    var connectionString = "username:password@cluster_endpoint:27017/?replicaSet=rs0";
    var clientSettings = MongoClientSettings.FromUrl(new MongoUrl("mongodb://" + connectionString));
    var certificatePath = "ssl\rds-combined-ca-bundle.pem";

    var pem = System.IO.File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + certificatePath);
    byte[] certBuffer = GetBytesFromPEM(pem, "CERTIFICATE");

    clientSettings.UseSsl = true;
    clientSettings.SslSettings = new SslSettings()
    {
        ClientCertificates = new List<X509Certificate2>()
        {
            new X509Certificate2(certBuffer)
        },
        EnabledSslProtocols = System.Security.Authentication.SslProtocols.Default,
        CheckCertificateRevocation = true
        };

    clientSettings.VerifySslCertificate = true;

    clientSettings.SslSettings.ClientCertificateSelectionCallback = (sender, host, certificates, certificate, issuers) => clientSettings.SslSettings.ClientCertificates.ToList()[0];
    clientSettings.SslSettings.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true;

    clientSettings.MaxConnectionIdleTime = new TimeSpan(0, 0, 30);

    _client = new MongoClient(clientSettings);
    _database = _client.GetDatabase(db.ToString());

0 голосов
/ 06 марта 2019

### Соединение с БД документов с помощью простой консоли .Net Приложение с SSL.

-> Прежде всего, включите SSL в кластере БД документов, установив для параметра tls значение «включено».Обязательно перезагрузите узел записи вашего кластера, чтобы перезагрузить весь кластер, чтобы применить изменения группы параметров.По умолчанию TLS включен, когда вы запускаете новый кластер Doc DB.

-> Настройка SSL-сертификата в вашей среде:

1) Загрузите SSL-сертификат PKCS # 7 на компьютере с исходным Windows.по приведенной ниже ссылке:

https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.p7b

2) Щелкните меню «Пуск», выберите «Выполнить» и введите mmc

3) В MMC, Файл-> Добавить / Удалить привязку-in.

4) Выберите «Сертификаты» из списка оснасток и нажмите «Добавить».

5) Сертификаты доверенного ЦС должны находиться в хранилище локального компьютера, поэтому выберите «Учетная запись компьютера».Нажмите кнопку «Далее» и выберите «Локальный компьютер».Нажмите «Далее», а затем «Готово».

6) Теперь на левой панели (в разделе «Корень консоли» вы увидите параметр «Сертификаты». Нажмите на него.

7) Появится список,щелкните правой кнопкой мыши «Доверенные корневые центры сертификации», затем выберите «Все задачи» -> «Импорт»

8). В открывшемся окне нажмите «Далее», найдите файл сертификата (.p7b), загруженный на шаге 1 (если выне удается найти его, в раскрывающемся списке типов файлов выберите «Все файлы», а затем «Продолжить», нажмите «Далее» и, наконец, «Готово»Затем сохраните конфигурацию.

-> Затем написали следующий код:

---------------------------------------------------

using MongoDB.Bson;
using MongoDB.Driver;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
namespace FirstDocDB
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var connectionString = "mongodb://pulkit:password@ClusterID:27017/?ssl=true&sslVerifyCertificate=true&replicaSet=rs0";
            var client = new MongoClient(connectionString);
            var database = client.GetDatabase("test");
            var collection = database.GetCollection("stuff");
            var document = collection.Find(new BsonDocument()).FirstOrDefault();
            Console.WriteLine(document.ToString());
        }
    }
}

---------------------------------------------------

-> И после сборки и запуска мне удалось получить документ в коллекции с именем «stuff».”As output: {" _id ": ObjectId (" 5c5a63b10cf861158c1d241c ")," hello ":" world "}

Таким образом, выполнив вышеуказанные шаги, я смог успешно подключиться к БД документов с помощью драйвера Mongoдля .Net.

0 голосов
/ 08 марта 2019

У меня была похожая проблема, у меня был открыт тикет с AWS, и он был решен с помощью тех же шагов, что и ответ Pulkit Agarwal.

Основным изменением была строка подключения, даже после добавления сертификата в локальное хранилище, которое я все еще использовалстрока запроса как "? ssl_ca_certs = rds-комбинированный-ca-bundle.pem & replicaSet = rs0", которую необходимо изменить на "? ssl = true & sslVerifyCertificate = true & replicaSet = rs0"

0 голосов
/ 25 февраля 2019

Попробуйте добавить файл CA RDS в ваше хранилище доверия C #.

            X509Store store = new X509Store(StoreName.Root);
            X509Certificate2 ca = new X509Certificate2(<path_to_rds-combined-ca-bundle.pem>);
            try {
                store.Open(OpenFlags.ReadWrite);
                store.Add(ca);
            } catch (Exception ex) {
                Console.WriteLine("Root certificate import failed: " + ex.Message);
                throw;
            } finally {
                store.Close();
            }
...