Назад | Перейти на главную страницу

MongoDB, Windows Server, SSL-сертификат, соединение с компасом не работает

Системная информация:

Проблема: я могу подключиться с удаленной рабочей станции с помощью командной строки Mongo, но не могу подключиться с помощью Compass Community Edition. Я использую самозаверяющий сертификат, созданный OpenSSL для тестирования. Надеюсь, когда я со всем этим разберусь, я получу «официально» сертификат от Microsoft или Network Solutions.

Базовый запрос помощи: помогите мне понять, как войти на сервер MongoDB с помощью пользовательского интерфейса Compass.

Ошибка компаса:

Не удалось подключиться к MongoDB на указанном хосте и порту.

Ошибка журнала Mongo:

2018-03-08T13:12:39.365-0600 I NETWORK  [listener] connection accepted from MYLOCALIP:62794 #127 (1 connection now open)
2018-03-08T13:12:39.392-0600 E NETWORK  [conn127] no SSL certificate provided by peer; connection rejected
2018-03-08T13:12:39.392-0600 I NETWORK  [conn127] Error receiving request from client: SSLHandshakeFailed: SSLHandshakeFailed. Ending connection from MYLOCALIP:62794 (connection id: 127)
2018-03-08T13:12:39.392-0600 I NETWORK  [conn127] end connection MYLOCALIP:62794 (0 connections now open)

Шаги, которые я сделал (для ссылка).

Обратите внимание, что перед запуском команд OpenSSL я подготовил каталог со следующим:

echo 00 > file.srl
echo 01 > serial
fsutil file createnew index.txt 0
fsutil file createnew index.txt.attr 0

Создайте сертификаты: ссылка.

// CA - KEY

openssl genrsa -aes256 -out ca.key.pem 4096 -days 3650 -subj "/C=US/ST=Tennessee/O=CompanyName/CN=root/emailAddress=myname@mycompany.com"

// Ключ сервера

openssl genrsa -out server.key 2048

// Loclhost работает (для справки, я сделал это сначала для локального тестирования)

// Создаем запрос на подпись сертификата сервера (CSR)

openssl req -key server.key -new -out server.req -subj  "/C=US/ST=Tennessee/O=CompanyName/CN=Server/CN=127.0.0.1/emailAddress=myname@mycompany.com"

// Создаем сертификат, подписанный СА

openssl x509 -req -in server.req -CA ca.cert.pem -CAkey ca.key.pem -CAserial file.srl -out server.crt -days 3650

// Mongo нужен сертификат, который представляет собой комбинацию закрытого ключа и объединенного сертификата

type server.key server.crt > server.pem

// Проверяем сертификат, чтобы убедиться, что он в порядке

openssl verify -CAfile ca.cert.pem server.pem

Я обнаружил, что для удаленного подключения мне нужно было создать «удаленный» сертификат с IP-адресом сервера Windows, на котором запущен MongoDB. Вот все шаги без комментариев. Они точно такие же, как и местные, но с небольшими изменениями, как показано:

// Remote working IP xx.xxx.xx.xx
openssl req -key server.key -new -out remote_server.req -subj  "/C=US/ST=Tennessee/O=CompanyName/CN=Server/CN=xx.xxx.xx.xx/emailAddress=myname@mycompany.com"
openssl x509 -req -in remote_server.req -CA ca.cert.pem -CAkey ca.key.pem -CAserial file.srl -out remote_server.crt -days 3650

type server.key remote_server.crt > remote_server.pem
openssl verify -CAfile ca.cert.pem remote_server.pem

Теперь мне нужен был клиент:

// Клиент

openssl genrsa -out client.key 2048
openssl req -key client.key -new -out client.req -subj "/C=US/ST=Tennessee/O=CompanyName/CN=Client/emailAddress=myname@mycompany.com"
openssl x509 -req -in client.req -CA ca.cert.pem -CAkey ca.key.pem -CAserial file.srl -out client.crt -days 3650
type client.key client.crt > client.pem
openssl verify -CAfile ca.cert.pem client.pem

После этого я установил свой mongodb.conf файл следующим образом:

systemLog:
  verbosity: 0
  destination: file
  path: "D:\\MongoLogs\\mongolog.log"
  logAppend: true
storage:
  dbPath: "D:\\MongoData"
security:
  authorization: enabled
net:
  port: 27017
  bindIpAll: true
  ssl:
    mode: requireSSL
    PEMKeyFile: "D:\\remote\\remote_server.pem"
    CAFile: "D:\\remote\\ca.cert.pem"

Обратите внимание, что я бы заменил remote_server.pem с участием server.pem если я хочу подключиться с сервера как клиент к серверу.

На сервере я запускаю MongoDB со следующим:

mongod --dbpath D:\MongoData\ --logpath D:\MongoLogs\mongolog.log --logappend --config D:\MongoConfig\mongo.conf

Теперь я переключаюсь с сервера на свой локальный компьютер, который не находится в Azure или чем-то еще, но у него есть доступ в Интернет, и MongoDB также установлен в этой системе. Затем я запускаю эту командную строку:

mongo xx.xxx.xx.xx -u AdminUserName -p AdminPassword --authenticationDatabase admin -ssl -sslCAFile E:\tmp4\ca.cert.pem --sslPEMKeyFile E:\tmp4\client.pem

Вот успех соединения с командной строкой:

MongoDB shell version v3.6.2
connecting to: mongodb://xx.xxx.xx.xx:27017/test
MongoDB server version: 3.6.3
Server has startup warnings:
2018-03-08T12:31:03.774-0600 I CONTROL  [initandlisten]
2018-03-08T12:31:03.774-0600 I CONTROL  [initandlisten] ** WARNING: The file system cache of this machine is configured to be greater than 40% of the total memory. This can lead to increased memory pressure and poor performance.
2018-03-08T12:31:03.774-0600 I CONTROL  [initandlisten] See http://dochub.mongodb.org/core/wt-windows-system-file-cache
2018-03-08T12:31:03.774-0600 I CONTROL  [initandlisten]
>

Точно так же журнал показывает установленное соединение:

2018-03-08T13:47:00.023-0600 I NETWORK  [conn128] received client metadata from MYLOCALIP:63346 conn: { application: { name: "MongoDB Shell" }, driver: { name: "MongoDB Internal Client", version: "3.6.2" }, os: { type: "Windows", name: "Microsoft Windows 10", architecture: "x86_64", version: "10.0 (build 16299)" } }
2018-03-08T13:47:00.093-0600 I ACCESS   [conn128] Successfully authenticated as principal DBAdminUserName on admin

На этом этапе основные команды, такие как db.help() и такая работа.

Все хорошо. Теперь я думаю: «Давайте подключимся к Компасу!»

Независимо от того, какую комбинацию я пробую, ничего не получается. Вот основная информация:

Может ли кто-нибудь помочь мне понять, что мне нужно сделать, чтобы пользовательский интерфейс Compass мог войти в систему?