Обзор: У меня есть сервер приложений под управлением 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
исключение: не удалось подключиться
Ожидаемое поведение: Я не хочу использовать аутентификацию сертификата клиента для подключения к базе данных. Все, что я хочу сейчас, — это шифрование трафика. Это означает возможность подключения к базе данных без использования самозаверяющих сертификатов.
Заметки:
У меня успешно установлен сертификат на сервере приложений для подключения HTTPS. Кроме того, при тестировании сертификата, упомянутого в этом вопросе, я успешно запустил проверку файлов, используя openssl verify -CAfile /path/to/my_ca_bundle /path/to/my_ca_signed_cert
,
Все в моем коде приложения работает, когда SSL отключен или включен, когда разрешены самозаверяющие сертификаты.
Документация на все это невероятно расплывчата по ряду пунктов, поэтому я не уверен, где моя конфигурация идет не так. Что я должен искать, чтобы решить эту проблему?
Я думаю, что вы можете попробовать добавить опцию 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
Больше информации здесь:
Я решил еще раз взяться за эту проблему и, наконец, нашел решение.
Во-первых, мне нужно было переместить /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
линия отмечена в другом ответе.
Это был беспорядок, но теперь все работает!