sql >> Base de Datos >  >> NoSQL >> MongoDB

Conexión SSL autofirmada usando PyMongo

Hay otras formas de generar pem de servidor/cliente con una autoridad de certificación, es decir, sin involucrar file.srl , pero esta respuesta es para dar seguimiento a la pregunta.

Vale la pena mencionar que la mayoría de las distribuciones de MongoDB v3.0+ ahora incluyen soporte para SSL, asegúrese de elegir un paquete que admita SSL. El siguiente ejemplo se prueba con MongoDB v3.2 en Ubuntu Linux 14.04 con PyMongo v3.2.1. Donde una sola máquina generó los archivos pem de la CA, el servidor y el cliente con fines de demostración.

Generemos ca.pem y privkey.pem . La estructura del asunto es /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]"

Generar server .pem archivo:

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

Aunque puede usar la dirección IP como CN valor también, no es recomendable. Ver RFC-6125.

Ahora generemos client.pem archivo:

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

Después de generar el .pem archivos, ahora puede ejecutar mongod. por ejemplo:

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

Puede probar la conexión usando el shell mongo, por ejemplo:

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

Una vez que pueda conectarse con éxito, puede probar con PyMongo. Por ejemplo:

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

Alternativamente, también puede usar mongod flag --sslAllowInvalidHostnames para especificar localhost , etc.

Para uso en producción, su implementación de MongoDB debe usar certificados válidos generados y firmados por una sola autoridad de certificación. Si usa un certificado autofirmado, aunque el canal de comunicaciones estará encriptado, no habrá validación de la identidad del servidor. El uso de un certificado firmado por una autoridad de certificación de confianza permitirá a los controladores de MongoDB verificar la identidad del servidor. En general, evite usar certificados autofirmados a menos que la red sea de confianza.

Otros enlaces relacionados que pueden resultarle útiles:

  • MongoDB:Configurar SSL.
  • MongoDB:Tutoriales de seguridad.
  • Lista de verificación de seguridad de MongoDB.