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.