MongoDB подключается через SSL: что я делаю не так?

Обзор: У меня есть сервер приложений под управлением PHP 7, который подключается к отдельному серверу баз данных под управлением MongoDB 3.6.x с помощью библиотеки пользовательского интерфейса MongoDB PHP. У меня есть правила брандмауэра, запрещающие доступ к серверу MongoDB из всех источников, кроме локальных и частных интерфейсов (т.е. запрещение публичного доступа по IP).

Соединения через PHP выглядят примерно так:

$context_information = array(
"ssl" => array(
"allow_self_signed" => false,
"verify_peer"       => true,
"verify_peer_name"  => true,
"verify_expiry"     => true,
"cafile"            => "/path/to/ca_bundle"));

$context = stream_context_create($context_information);
$connection = new MongoDB\Client(
$host,
array('ssl'=>true),
array('context'=> $context)
);

Моя конфигурация MongoDB выглядит примерно так:

net:
port: 27017
bindIp: 127.0.0.1,10.138.196.241
ssl:
mode: requireSSL
PEMKeyFile: /path/to/my_ca_signed_cert
CAFile: /path/to/my_ca_bundle

my_ca_signed_cert это .pem файл, созданный с использованием моего открытого ключа RSA, сгенерированного openssl, а также предоставленного CA .crt файл, как описано в руководстве MongoDB, например, cat mongodb.key mongodb.crt > mongodb.pem, my_ca_bundle это .ca-bundle предоставленный мне CA.

Кроме того, ca_bundle описано в контексте PHP то же самое .ca-bundle файл как в конфиге MongoDB.

Проблема: Я продолжаю получать следующую ошибку:

[23-Jul-2018 16:33:33 Америка / Los_Angeles] Неустранимая ошибка PHP: Uncaught MongoDB \ Driver \ Exception \ ConnectionTimeoutException: не найдено подходящих серверов (serverSelectionTryOnce set): [Сбой квитирования TLS: ошибка: 14090086: процедуры SSL: ssl3_get_server_certificate: проверка сертификата не удалась, вызов ismaster включен. , ,

Эта проблема сохраняется, даже если я закомментирую CAFile строка для конфигурации MongoDB. Также следует отметить, что я могу успешно подключиться при настройке allow_self_signed в true если CAFile закомментировано, но не тогда, когда оно оставлено без комментариев.

Наконец, при попытке подключения через оболочку MongoDB я получаю следующую ошибку:

2018-07-23T23: 37: 02.992 + 0000 E NETWORK [thread1] Проверка сертификата однорангового SSL-узла не выполнена: невозможно получить сертификат эмитента

2018-07-23T23: 37: 02.992 + 0000 E QUERY [thread1] Ошибка: исключение сокета [CONNECT_ERROR] для проверки сертификата однорангового узла SSL: невозможно получить сертификат эмитента:

connect@src/mongo/shell/mongo.js: 251: 13

@ (Подключение): 1: 6

исключение: не удалось подключиться

Ожидаемое поведение: Я не хочу использовать аутентификацию сертификата клиента для подключения к базе данных. Все, что я хочу сейчас, — это шифрование трафика. Это означает возможность подключения к базе данных без использования самозаверяющих сертификатов.

Заметки:

  1. У меня успешно установлен сертификат на сервере приложений для подключения HTTPS. Кроме того, при тестировании сертификата, упомянутого в этом вопросе, я успешно запустил проверку файлов, используя openssl verify -CAfile /path/to/my_ca_bundle /path/to/my_ca_signed_cert,

  2. Все в моем коде приложения работает, когда SSL отключен или включен, когда разрешены самозаверяющие сертификаты.

Документация на все это невероятно расплывчата по ряду пунктов, поэтому я не уверен, где моя конфигурация идет не так. Что я должен искать, чтобы решить эту проблему?

7

Решение

Я думаю, что вы можете попробовать добавить опцию allowConnectionsWithoutCertificates в конфигурации ssl. Ваше соединение зашифровано, но игнорирует аутентификацию сертификата.

net:
port: 27017
bindIp: 127.0.0.1,10.138.196.241
ssl:
mode: requireSSL
PEMKeyFile: /path/to/my_ca_signed_cert
CAFile: /path/to/my_ca_bundle
allowConnectionsWithoutCertificates: true

Больше информации здесь:

https://docs.mongodb.com/manual/reference/configuration-options/#net.ssl.allowConnectionsWithoutCertificates

1

Другие решения

Я решил еще раз взяться за эту проблему и, наконец, нашел решение.

Во-первых, мне нужно было переместить /path/to/my_ca_bundle в /usr/share/ca-certificates/my_project/my_ca_bundle,

Во-вторых, мне нужно было обновить /etc/ca-certificates.conf с линией my_project/my_ca_bundle,

В-третьих, мне нужно было бежать sudo update-ca-certificates,

Наконец, мне нужно было удалить ssl.cafile опция из моего потока PHP контекста (я не могу заставить его работать с этой строкой на месте).

CAFile вариант в /etc/mongod.conf также является ненужным и проблематичным, если он не использует allowConnectionsWithoutCertificates: true линия отмечена в другом ответе.

Это был беспорядок, но теперь все работает!

1