sql >> Database teknologi >  >> NoSQL >> MongoDB

Selvsigneret SSL-forbindelse ved hjælp af PyMongo

Der er andre måder at generere server/klient pem med en certifikatmyndighed, dvs. uden at involvere file.srl , men dette svar er for at følge op på spørgsmålet.

Værd at nævne, at de fleste MongoDB v3.0+ distributioner nu inkluderer understøttelse af SSL. Sørg for at vælge en pakke, der understøtter SSL. Eksemplet nedenfor er testet med MongoDB v3.2 på Ubuntu Linux 14.04 med PyMongo v3.2.1. Hvor en enkelt maskine genererede CA, server og klient pem-filer til demonstrationsformål.

Lad os generere ca.pem og privkey.pem . Emnestrukturen er /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]"

Generer server .pem fil:

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

Selvom du kan bruge IP-adresse som CN værdi også, det anbefales ikke. Se RFC-6125.

Lad os nu generere client.pem fil:

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

Efter generering af .pem filer, nu kan du køre mongod. for eksempel:

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

Du kan teste forbindelsen ved at bruge mongo-skallen, for eksempel:

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

Når du kan få forbindelse med succes, kan du prøve med PyMongo. For eksempel:

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

Alternativt kan du også bruge mongod flag --sslAllowInvalidHostnames for at angive localhost osv.

Til produktionsbrug skal din MongoDB-implementering bruge gyldige certifikater genereret og underskrevet af en enkelt certifikatmyndighed. Hvis du bruger et selvsigneret certifikat, vil der ikke være nogen validering af serveridentiteten, selvom kommunikationskanalen vil være krypteret. Brug af et certifikat, der er underskrevet af en betroet certifikatmyndighed, vil tillade MongoDB-drivere at bekræfte serverens identitet. Generelt skal du undgå at bruge selvsignerede certifikater, medmindre netværket er tillid til.

Andre relaterede links, som du kan finde nyttige:

  • MongoDB:Konfigurer SSL.
  • MongoDB:Sikkerhedsøvelser.
  • MongoDB sikkerhedstjekliste.



  1. Bruger $slice-operatoren for at få det sidste element i arrayet

  2. MongoDB omdøb databasefeltet i array

  3. Rediger og gentag MongoDB oplog

  4. node.js kan ikke finde modulet 'mongodb'