MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Connexion SSL auto-signée avec PyMongo

Il existe d'autres moyens de générer des pem serveur/client avec une autorité de certification, c'est-à-dire sans impliquer file.srl , mais cette réponse fait suite à la question.

Il convient de mentionner que la plupart des distributions MongoDB v3.0+ incluent désormais la prise en charge de SSL, assurez-vous de choisir un package prenant en charge SSL. L'exemple ci-dessous est testé avec MongoDB v3.2 sur Ubuntu Linux 14.04 avec PyMongo v3.2.1. Où une seule machine a généré les fichiers pem de l'autorité de certification, du serveur et du client à des fins de démonstration.

Générons ca.pem et privkey.pem . La structure du sujet est /C=<Country Name>/ST=<State>/L=<Locality Name>/O=<Organisation Name>/emailAddress=<email>/CN=<Common Name> .

mkdir ~/ssl
cd ~/ssl
openssl req -out ca.pem -new -x509 -days 3650 -subj "/C=AU/ST=NSW/O=Organisation/CN=root/[email protected]"

Générer server .pem fichier :

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

Bien que vous puissiez utiliser l'adresse IP comme CN valeur ainsi, il n'est pas recommandé. Voir RFC-6125.

Générons maintenant client.pem fichier :

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

Après avoir généré le .pem fichiers, vous pouvez maintenant exécuter mongod. par exemple :

mongod --sslMode requireSSL --sslPEMKeyFile ~/server.pem --sslCAFile ~/ca.pem

Vous pouvez tester la connexion à l'aide du shell mongo, par exemple :

mongo --ssl --sslPEMKeyFile ~/client.pem --sslCAFile ~/ca.pem --host <server hostname>

Une fois que vous pouvez vous connecter avec succès, vous pouvez essayer avec PyMongo. Par exemple :

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'
 )

Alternativement, vous pouvez également utiliser mongod flag --sslAllowInvalidHostnames pour spécifier localhost , etc.

Pour une utilisation en production, votre déploiement MongoDB doit utiliser des certificats valides générés et signés par une seule autorité de certification. Si vous utilisez un certificat auto-signé, bien que le canal de communication soit crypté, il n'y aura pas de validation de l'identité du serveur. L'utilisation d'un certificat signé par une autorité de certification de confiance permettra aux pilotes MongoDB de vérifier l'identité du serveur. En général, évitez d'utiliser des certificats auto-signés à moins que le réseau ne soit approuvé.

Autres liens connexes qui pourraient vous être utiles :

  • MongoDB :Configurez SSL.
  • MongoDB :Tutoriels de sécurité.
  • Liste de contrôle de sécurité MongoDB.