Istnieją inne sposoby generowania pem serwera/klienta za pomocą urzędu certyfikacji, tj. bez angażowania file.srl
, ale ta odpowiedź jest kontynuacją pytania.
Warto wspomnieć, że większość dystrybucji MongoDB v3.0+ zawiera teraz obsługę SSL, pamiętaj, aby wybrać pakiet, który obsługuje SSL. Poniższy przykład jest testowany z MongoDB v3.2 na Ubuntu Linux 14.04 z PyMongo v3.2.1. Gdzie pojedyncza maszyna wygenerowała pliki pem urzędu certyfikacji, serwera i klienta w celach demonstracyjnych.
Wygenerujmy ca.pem
i privkey.pem
. Struktura tematu to /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]"
Wygeneruj server .pem
plik:
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
Chociaż możesz użyć adresu IP jako CN
wartość, nie jest to zalecane. Zobacz RFC-6125.
Teraz wygenerujmy client.pem
plik:
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
Po wygenerowaniu pliku .pem
plików, teraz możesz uruchomić mongod. na przykład:
mongod --sslMode requireSSL --sslPEMKeyFile ~/server.pem --sslCAFile ~/ca.pem
Możesz przetestować połączenie za pomocą powłoki mongo, na przykład:
mongo --ssl --sslPEMKeyFile ~/client.pem --sslCAFile ~/ca.pem --host <server hostname>
Po pomyślnym nawiązaniu połączenia możesz spróbować z PyMongo. Na przykład:
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'
)
Alternatywnie możesz również użyć mongod
flag --sslAllowInvalidHostnames do określenia localhost
itp.
Do użytku produkcyjnego wdrożenie MongoDB powinno używać prawidłowych certyfikatów wygenerowanych i podpisanych przez jeden urząd certyfikacji. Jeśli używasz certyfikatu z podpisem własnym, mimo że kanał komunikacji będzie szyfrowany, nie będzie weryfikacji tożsamości serwera. Korzystanie z certyfikatu podpisanego przez zaufany urząd certyfikacji umożliwi sterownikom MongoDB weryfikację tożsamości serwera. Ogólnie rzecz biorąc, unikaj używania certyfikatów z podpisem własnym, chyba że sieć jest zaufana.
Inne powiązane linki, które mogą Ci się przydać:
- MongoDB:Skonfiguruj SSL.
- MongoDB:samouczki dotyczące bezpieczeństwa.
- Lista kontrolna bezpieczeństwa MongoDB.