MongoDB 自签名 SSL 连接 : SSL peer certificate validation failed

标签 mongodb ssl x509certificate

我已遵循本指南 Self-signed SSL connection using PyMongo, by Wan Bachtiar创建三个 .pem 文件; server.pem、client.pem 和 ca.pem。

我使用的是 Ubuntu 16.04 和 MongoDB v3.2.11。

目的是在将 MongoDB 开放到公共(public)互联网之前保护它。

让我们启动 mongod:

$ mongod --auth --port 27017 --dbpath /data/db1 
--sslMode requireSSL --sslPEMKeyFile /etc/ssl/server.pem 
--sslCAFile /etc/ssl/ca.pem --sslAllowInvalidHostnames &

输出:

root@tim:/etc/ssl# 2017-01-13T12:58:55.150+0000 I CONTROL  [initandlisten] MongoDB starting : pid=19058 port=27017 dbpath=/data/db1 64-bit host=tim
2017-01-13T12:58:55.150+0000 I CONTROL  [initandlisten] db version v3.2.11
2017-01-13T12:58:55.151+0000 I CONTROL  [initandlisten] git version: 009580ad490190ba33d1c6253ebd8d91808923e4
2017-01-13T12:58:55.151+0000 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.2g  1 Mar 2016
2017-01-13T12:58:55.152+0000 I CONTROL  [initandlisten] allocator: tcmalloc
2017-01-13T12:58:55.152+0000 I CONTROL  [initandlisten] modules: none
2017-01-13T12:58:55.152+0000 I CONTROL  [initandlisten] build environment:
2017-01-13T12:58:55.152+0000 I CONTROL  [initandlisten]     distmod: ubuntu1604
2017-01-13T12:58:55.152+0000 I CONTROL  [initandlisten]     distarch: x86_64
2017-01-13T12:58:55.152+0000 I CONTROL  [initandlisten]     target_arch: x86_64
2017-01-13T12:58:55.153+0000 I CONTROL  [initandlisten] options: { net: { port: 27017, ssl: { CAFile: "/etc/ssl/ca.pem", PEMKeyFile: "/etc/ssl/server.pem", allowInvalidHostnames: true, mode: "requireSSL" } 
}, security: { authorization: "enabled" }, storage: { dbPath: "/data/db1" } }
2017-01-13T12:58:55.211+0000 I -        [initandlisten] Detected data files in /data/db1 created by the 'wiredTiger' storage engine, so setting the active storage engine to 'wiredTiger'.
2017-01-13T12:58:55.212+0000 W -        [initandlisten] Detected unclean shutdown - /data/db1/mongod.lock is not empty.
2017-01-13T12:58:55.212+0000 W STORAGE  [initandlisten] Recovering data from the last clean checkpoint.
2017-01-13T12:58:55.212+0000 I STORAGE  [initandlisten] wiredtiger_open config: create,cache_size=1G,session_max=20000,eviction=(threads_max=4)
,config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),checkpoint=(wait=60,log_size=2GB),statistics_log=(wait=0),
2017-01-13T12:58:55.886+0000 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2017-01-13T12:58:55.886+0000 I CONTROL  [initandlisten]
2017-01-13T12:58:55.895+0000 I FTDC     [initandlisten] Initializing full-time diagnostic data capture with directory '/data/db1/diagnostic.data'
2017-01-13T12:58:55.897+0000 I NETWORK  [initandlisten] waiting for connections on port 27017 ssl
2017-01-13T12:58:55.897+0000 I NETWORK  [HostnameCanonicalizationWorker] Starting hostname canonicalization worker
2017-01-13T12:58:56.026+0000 I FTDC     [ftdc] Unclean full-time diagnostic data capture shutdown detected, found interim file, some metrics may have been lost. OK

运行mongod后,我启动mongo shell:

$ mongo --port 27017 -u "my username" -p "my password" 
--authenticationDatabase "" --ssl --sslPEMKeyFile /etc/ssl/client.pem 
--sslCAFile /etc/ssl/ca.pem --host tim

输出类似于 the question by Marshall Farrier ;让我们看看。

MongoDB shell version: 3.2.11
connecting to: 127.0.0.1:27017/datatest
2017-01-13T12:35:58.247+0000 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:38902 #8 (1 connection now open)
2017-01-13T12:35:58.259+0000 E NETWORK  [thread1] SSL peer certificate validation failed: self signed certificate
2017-01-13T12:35:58.259+0000 E QUERY    [thread1] Error: socket exception [CONNECT_ERROR] for SSL peer certificate validation failed: self signed certificate :
connect@src/mongo/shell/mongo.js:231:14
@(connect):1:6

2017-01-13T12:35:58.263+0000 E NETWORK  [conn8] SSL peer certificate validation failed: self signed certificate
2017-01-13T12:35:58.263+0000 I NETWORK  [conn8] end connection 127.0.0.1:38902 (0 connections now open)

我做错了什么?

最佳答案

经过一番搜索,这个错误似乎是由于主机名“CN”不正确。

来自 digitalocean :

每当您生成 CSR 时,系统都会提示您提供有关证书的信息。此信息称为专有名称 (DN)。 DN 中的一个重要字段是通用名称 (CN),它应该是您打算使用证书的主机的完全限定域名 (FQDN)。

同样来自 MongoDB documentation :

如果您的 MongoDB 部署使用 SSL,您还必须指定 --host 选项。 mongo 验证您连接的 mongod 或 mongos 的主机名是否与 mongod 或 mongos 的 --sslPEMKeyFile 证书的 CN 或 SAN 匹配。如果主机名与 CN/SAN 不匹配,mongo 将无法连接。

解决方案:

我重新生成了 key ,将 localhost 替换为 CN = <hostname> 中的任何其他主机名,并完成了指南 by Wan Bachtiar .

完成后运行以下命令:

$ mongo --port 27017 -u '<_username_>' -p '<_password_>' 
--authenticationDatabase "<_my db_>" --ssl --sslPEMKeyFile 
/etc/ssl/client.pem  --sslCAFile /etc/ssl/ca.pem --host localhost

注意: MongoDB 严格规定谁可以访问什么数据库,在 mongo shell 中进行快速测试:

> show dbs

返回错误。但是,我的用户实际上只能访问“<my db>”中指定的数据库,因此遍历“<my db>”中的行非常有效。

关于MongoDB 自签名 SSL 连接 : SSL peer certificate validation failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41635371/

相关文章:

javascript - 如何使用 Mongoose + Express.js 存储数组?

ios - 为什么在发送任何 SSL 消息之前我的 SSL 握手失败?

azure - 如何让 AzureRM 应用程序网关将 ACME .PEM 证书作为 AGW SSL 端到端配置中的 trust_root_certificates?

wcf - 无法让 Azure WCF 服务与客户端证书一起使用

mongodb - 如何将 mongodb 字段数据类型从 NumberLong 更改为 Double?

mysql - 为什么 mongoDB 的 Select 时间比 Fetch 时间少?

javascript - docker-compose 仅​​运行我的 mongodb 服务器但不运行我的 js 文件

ssl - TLS Extended Master Secret - 计算 session 哈希

xml - Mule SSL 连接器中的协议(protocol)

c# - 从 X509 Cert pfx 文件中获取字符串