MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Selbstsignierte SSL-Verbindung mit PyMongo

Es gibt andere Möglichkeiten, Server/Client-PEM mit einer Zertifizierungsstelle zu generieren, d. h. ohne Einbeziehung von file.srl , aber diese Antwort dient der Weiterverfolgung der Frage.

Erwähnenswert ist, dass die meisten MongoDB v3.0+-Distributionen jetzt Unterstützung für SSL enthalten. Bitte achten Sie darauf, ein Paket zu wählen, das SSL unterstützt. Das folgende Beispiel wurde mit MongoDB v3.2 auf Ubuntu Linux 14.04 mit PyMongo v3.2.1 getestet. Wo ein einzelner Computer die CA-, Server- und Client-PEM-Dateien zu Demonstrationszwecken generiert hat.

Lassen Sie uns ca.pem generieren und privkey.pem . Die Betreffstruktur ist /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]"

Generieren Sie server .pem Datei:

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

Obwohl Sie die IP-Adresse als CN verwenden können Wert sowie, es wird nicht empfohlen. Siehe RFC-6125.

Lassen Sie uns nun client.pem generieren Datei:

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

Nach dem Generieren der .pem Dateien, jetzt können Sie Mongod ausführen. zum Beispiel:

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

Sie können die Verbindung beispielsweise mit der Mongo-Shell testen:

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

Sobald Sie erfolgreich verbunden sind, können Sie es mit PyMongo versuchen. Zum Beispiel:

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

Alternativ können Sie auch mongod verwenden flag --sslAllowInvalidHostnames um localhost anzugeben usw.

Für den Produktionseinsatz sollte Ihre MongoDB-Bereitstellung gültige Zertifikate verwenden, die von einer einzigen Zertifizierungsstelle generiert und signiert wurden. Wenn Sie ein selbstsigniertes Zertifikat verwenden, wird der Kommunikationskanal zwar verschlüsselt, aber die Serveridentität wird nicht überprüft. Durch die Verwendung eines von einer vertrauenswürdigen Zertifizierungsstelle signierten Zertifikats können MongoDB-Treiber die Identität des Servers überprüfen. Vermeiden Sie im Allgemeinen die Verwendung von selbstsignierten Zertifikaten, es sei denn, das Netzwerk ist vertrauenswürdig.

Andere verwandte Links, die Sie nützlich finden könnten:

  • MongoDB:SSL konfigurieren.
  • MongoDB:Sicherheits-Tutorials.
  • MongoDB-Sicherheitscheckliste.