Има и други начини за генериране на сървър/клиент pem със сертифициращ орган, т.е. без да се включва file.srl
, но този отговор е да последвам въпроса.
Струва си да се спомене, че повечето дистрибуции на MongoDB v3.0+ вече включват поддръжка за SSL, моля, не забравяйте да изберете пакет, който поддържа SSL. Примерът по-долу е тестван с MongoDB v3.2 на Ubuntu Linux 14.04 с PyMongo v3.2.1. Когато една машина генерира CA, сървър и клиент pem файлове за демонстрационни цели.
Нека генерираме ca.pem
и privkey.pem
. Структурата на темата е /C=<Име на държава>/ST=<Щат>/L=<Име на населено място>/O=<Име на организация>/emailAddress=
mkdir ~/ssl
cd ~/ssl
openssl req -out ca.pem -new -x509 -days 3650 -subj "/C=AU/ST=NSW/O=Organisation/CN=root/[email protected]"
Генерирайте сървър .pem
файл:
hostname # note down the value
echo "00" > file.srl # two random digits number
openssl genrsa -out server.key 2048
openssl req -key server.key -new -out server.req -subj "/C=AU/ST=NSW/O=Organisation/CN=server1/CN=<hostname value>/[email protected]"
openssl x509 -req -in server.req -CA ca.pem -CAkey privkey.pem -CAserial file.srl -out server.crt -days 3650
cat server.key server.crt > server.pem
openssl verify -CAfile ca.pem server.pem
Въпреки че можете да използвате IP адрес като CN
стойност също, не се препоръчва. Вижте RFC-6125.
Сега нека генерираме client.pem
файл:
openssl genrsa -out client.key 2048
openssl req -key client.key -new -out client.req -subj "/C=AU/ST=NSW/O=Organisation/CN=client1/[email protected]"
openssl x509 -req -in client.req -CA ca.pem -CAkey privkey.pem -CAserial file.srl -out client.crt -days 3650
cat client.key client.crt > client.pem
openssl verify -CAfile ca.pem client.pem
След генериране на .pem
файлове, сега можете да стартирате mongod. например:
mongod --sslMode requireSSL --sslPEMKeyFile ~/server.pem --sslCAFile ~/ca.pem
Можете да тествате връзката с помощта на mongo shell, например:
mongo --ssl --sslPEMKeyFile ~/client.pem --sslCAFile ~/ca.pem --host <server hostname>
След като можете да се свържете успешно, можете да опитате с PyMongo. Например:
import ssl
from pymongo import MongoClient
client = MongoClient(
'<server hostname>',
27017,
ssl=True,
ssl_certfile='~/client.pem',
ssl_cert_reqs=ssl.CERT_REQUIRED,
ssl_ca_certs='~/ca.pem'
)
Като алтернатива можете да използвате и mongod
флаг --sslAllowInvalidHostnames, за да посочите localhost
и др.
За производствена употреба, вашето внедряване на MongoDB трябва да използва валидни сертификати, генерирани и подписани от един сертифициращ орган. Ако използвате самоподписан сертификат, въпреки че комуникационният канал ще бъде криптиран, няма да има валидиране на идентичността на сървъра. Използването на сертификат, подписан от доверен сертифициращ орган, ще позволи на драйверите на MongoDB да проверят самоличността на сървъра. Като цяло избягвайте да използвате самоподписани сертификати, освен ако мрежата не е надеждна.
Други свързани връзки, които може да ви бъдат полезни:
- MongoDB:Конфигуриране на SSL.
- MongoDB:Уроци за сигурност.
- Контролен списък за сигурност на MongoDB.