MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Conexão SSL autoassinada usando PyMongo


Existem outras maneiras de gerar servidor/cliente pem com uma Autoridade de Certificação, ou seja, sem envolver file.srl , mas esta resposta é para acompanhar a pergunta.

Vale a pena mencionar que a maioria das distribuições do MongoDB v3.0+ agora inclui suporte para SSL, certifique-se de escolher um pacote que suporte SSL. O exemplo abaixo foi testado com MongoDB v3.2 no Ubuntu Linux 14.04 com PyMongo v3.2.1. Onde uma única máquina gerou os arquivos pem da CA, servidor e cliente para fins de demonstração.

Vamos gerar ca.pem e privkey.pem . A estrutura de assunto é /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]"

Gerar server .pem Arquivo:
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

Embora você possa usar o endereço IP como CN valor também, não é recomendado. Consulte RFC-6125.

Agora vamos gerar client.pem Arquivo:
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

Depois de gerar o .pem arquivos, agora você pode executar o mongod. por exemplo:
mongod --sslMode requireSSL --sslPEMKeyFile ~/server.pem --sslCAFile ~/ca.pem

Você pode testar a conexão usando o shell mongo, por exemplo:
mongo --ssl --sslPEMKeyFile ~/client.pem --sslCAFile ~/ca.pem --host <server hostname>

Depois de se conectar com sucesso, você pode tentar com o PyMongo. Por exemplo:
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, você também pode usar mongod flag --sslAllowInvalidHostnames para especificar localhost , etc

Para uso em produção, sua implantação do MongoDB deve usar certificados válidos gerados e assinados por uma única autoridade de certificação. Se você usar um certificado autoassinado, embora o canal de comunicação seja criptografado, não haverá validação da identidade do servidor. O uso de um certificado assinado por uma autoridade de certificação confiável permitirá que os drivers do MongoDB verifiquem a identidade do servidor. Em geral, evite usar certificados autoassinados, a menos que a rede seja confiável.

Outros links relacionados que podem ser úteis:
  • MongoDB:configurar SSL.
  • MongoDB:tutoriais de segurança.
  • Lista de verificação de segurança do MongoDB.