MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Самоподписана SSL връзка с помощта на PyMongo

Има и други начини за генериране на сървър/клиент 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=/CN=<Общо име> .

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как MongoDB се различава от SQL база данни

  2. Как работи примерът за броя на съобщенията в документите на Meteor?

  3. Как да получа последните N записи в mongodb?

  4. Защо PyMongo 3 дава ServerSelectionTimeoutError?

  5. Как мога да настроя MongoDB на сървър Node.js, използвайки node-mongodb-native в EC2 среда?