私は、SSLを使用するドッキングされたMongoDBをテストするために設定しています。設定はすべてうまくいきますが、接続しようとすると次のエラーが発生します。
SSL peer certificate validation failed: self signed certificate in certificate chain.
CAとサーバー/クライアントの証明書を生成する方法は次のとおりです。
# CA
openssl genrsa -out ca/ca.key 2048
openssl req -x509 -new -key ca/ca.key -days 10000 -out ca/ca.crt
# Server
openssl genrsa -out server/mongodb.key 2048
openssl req -new -key server/mongodb.key -out server/mongodb.csr
openssl x509 -req -in server/mongodb.csr -CA ca/ca.crt -CAkey ca/ca.key -CAcreateserial -out server/mongodb.crt -days 365
cat server/mongodb.key server/mongodb.crt > server/server.pem
# Client
openssl genrsa -out client/cl.key 2048
openssl req -new -key client/cl.key -out client/cl.csr
openssl x509 -req -in client/cl.csr -CA ca/ca.crt -CAkey ca/ca.key -CAcreateserial -out client/cl.crt -days 365
cat client/cl.key client/cl.crt > client/cl.pem
これが私のMongoDB構成ファイルです(ファイルパスは無視してください)。
net:
bindIp: 0.0.0.0
port: 28018
ssl:
CAFile: /etc/mongo/ssl/ca/ca.crt
PEMKeyFile: /etc/mongo/ssl/server/server.pem
mode: requireSSL
storage:
dbPath: /mongo/db
journal:
enabled: true
そして、これが私がそれに接続している方法です:
mongo --Host 127.0.0.1 --port 28018 --ssl --sslCAFile mongoconf/config/ssl/server/server.pem --sslPEMKeyFile mongoconf/config/ssl/client/cl.pem
ローカルのmongoconf/config
は、コンテナのetc/mongo
にマップされます。
--sslCAFile
を指すserver.pem
ファイルにあるように見えるCAファイルではなく/etc/mongo/ssl/ca/ca.crt
。その結果、クライアント接続用に生成した証明書は有効とは見なされません。
いくつかのオプションがあり、クライアントによる証明書なしの接続を許可できます(クライアント側はSSL暗号化されたままで、クライアント側を検証するための証明書はありません)。これは、サーバーで allowConnectionsWithoutCertificates
オプションを指定することによって行われ、WebでのHTTPS
の機能と機能的に同等です。
もちろん、もう1つのオプションは、サーバー証明書ではなくCA証明書を指すようにsslCAFile
パスを修正することです。