MongoDB 自签名 SSL 连接:SSL 对等证书验证失败

2023-12-27

我已遵循本指南使用 PyMongo 的自签名 SSL 连接,作者:Wan Bachtiar https://stackoverflow.com/questions/35790287/self-signed-ssl-connection-using-pymongo#35967188创建三个 .pem 文件;服务器.pem、客户端.pem 和 ca.pem。

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

目的是在向公共互联网开放 MongoDB 之前确保其安全。

让我们启动 mongodb:

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

Output:

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

输出类似于马歇尔·法里尔提出的问题 https://stackoverflow.com/questions/35790287/self-signed-ssl-connection-using-pymongo#35967188;我们来看一下。

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”不正确造成的。

From 数字海洋 https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs:

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

同样来自 MongoDB文档 https://docs.mongodb.com/manual/tutorial/configure-ssl-clients/#ssl-clients:

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

解决方案:

我重新生成了密钥,将 localhost 替换为 CN = hostname> 并完成指南通过万·巴赫蒂亚尔 https://stackoverflow.com/questions/35790287/self-signed-ssl-connection-using-pymongo#35967188.

完成后运行以下命令有效:

$ 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 中进行快速测试:

> 显示数据库

返回错误。但是,我的用户实际上只能访问“my db>”,因此循环遍历“my db>” 工作完美。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB 自签名 SSL 连接:SSL 对等证书验证失败 的相关文章

随机推荐

  • :force => true 在模式文件中意味着什么

    如果你查看 db schema rb 你会看到类似的内容 create table users force gt true do t 什么是 force gt true mean 来自Rails 文档 http api rubyonrail
  • 计算用箭头和鼠标移动的对象

    我正在使用 openGL 做一个 Maya 模拟器应用程序 一切进展顺利 只有一个麻烦 我无法计算出通过鼠标移动物体的 100 准确度 我使用 3D 坐标中的箭头和屏幕坐标中的箭头的缩放 并将其乘以一些缩放来计算屏幕坐标的 x 和 y 方向
  • TensorFlow 嵌入查找

    我正在尝试学习如何使用 TensorFlow 构建用于语音识别的 RNN 首先 我想尝试 TensorFlow 页面上提供的一些示例模型TF RNN https www tensorflow org versions master tuto
  • 如何为 Chrome 上的每个选项卡获取不同的徽章值?

    我正在尝试做像 adblock 那样的事情 Adblock 计算 广告 的数量并更新徽章值 目前 我尝试对 背景页面 执行某些操作 但它们仅运行一次 并且所有选项卡的徽章值都相同 我无法使用浏览器操作 popup html 因为它仅在单击后
  • 在与其他线串的交叉点处匀称分割线串

    我有一组与其他 LineString 相交的 LineString 我想在这些交叉点将 LineString 分割成单独的线段 我有一个解决方案 但我认为这不是最好的方法 假设我们正在处理一个 LineString gt gt gt imp
  • 基于滚动位置的 div 位置

    我希望我的徽标根据网站上的滚动位置垂直上下滚动 就像默认滚动条指示您在网站上的位置一样 我希望我的徽标也能这样做 当您位于网站页面的顶部时 徽标位于顶部 而当您位于底部时 徽标将位于页面底部的垂直栏中 位于网页左侧 我不知道如何解决这个问题
  • Curl_exec 在 php 中返回 null

    我在使用curl操作获取数据时遇到问题 在这里我隐藏了令牌 如果我仅在浏览器中使用网址 那么它会返回数据 但这里它为空
  • 根据条件收集变量 (R)

    我正在阅读 R for Data Science 一书 并希望根据条件 类似于选择 从数据集中 收集 多个变量 具体来说 我想只选择连续变量而不是分类变量 如何在不手动指定变量的情况下完成此任务 下面不行 library tidyverse
  • node.js 将 http 响应写入流

    我正在通过 http 获取一些二进制数据 我的代码如下所示 var writeStream fs createWriteStream fileName request url function err res res socket pipe
  • Gecko(或任何其他布局引擎)如何呈现文档/页面?

    浏览 Gecko 的文档来了解它如何呈现网页有点困难 我正在对主要浏览器上的项目进行一些性能分析 以了解如何提高响应时间 我知道那里有优化技术 但我并不真正理解它们的基础 我相信如果我知道浏览器引擎如何做它们的事情 这个问题就会得到解决 我
  • 如何在角度应用程序中对 router.navigate 进行单元测试 [重复]

    这个问题在这里已经有答案了 我正在为角度应用程序运行单元测试 我想对导航在角度应用程序中是否正常工作进行单元测试 if this customer length 0 this router navigate nocustomer 以及这个的
  • Laravel 4.1:如何对雄辩的渴望关系进行分页?

    存在关于旧的 L3 急切加载分页的问题 而不是使用 eloquent 但我想使用雄辩来获得与分页的热切加载关系 主要型号 Topic与有一对多关系Posts 所以那个Topic有很多Posts 我用这个函数获取所有数据 public fun
  • 在 Objective-C 中,什么实用程序在注释中使用 @brief 标签?

    我刚刚开始使用 Objective C 编程 发现了一些示例注释 如下所示 brief The UIImageView we use to display the image generated from the imageBuffer 目
  • MATLAB 向量化:从向量元素填充结构体字段

    我有一个结构向量 每个结构都有一个字段x s1 x 1 s2 x 2 s3 x 3 S s1 s2 s3 我想设置字段x中所有结构的S从给定向量X 即我想对以下循环进行矢量化 X 97 98 99 for i 1 length S S i
  • 是否有关于设置 Mamp Pro 以便本地网络用户可以查看/编辑站点的明确指南?

    我一直在研究如何设置 LAN Mamp Pro 服务器 以便本地用户可以编辑 查看站点 但似乎有很多混乱 至少根据我阅读的原因 我很困惑 具体问题 将 Apache Mysql 作为 www mysql 运行 当我将用户切换到 www my
  • 反转或反向迭代 unordered_map

    我正在尝试以相反的顺序打印 unordered map 的内容 但是 它没有 rbegin 或 rend 所以你不能使用reverse iterator unordered map 的反转应该如何完成 编辑 来自评论 我希望键按照插入的顺序
  • Shadow dom ::part 元素的样式子元素

    我有一个 Web 组件 可以在 Shadow dom 中呈现以下内容
  • 在完成命令按钮操作时调用 javascript

    命令按钮操作完成后如何调用 JavaScript 函数 我正在使用 JSF 1 0 只需让 JSF 有条件地呈现所需的脚本即可 E g
  • Chrome 中 SVG 线性渐变的舍入误差?

    我最近在 Chrome 渲染 SVG 线性渐变时发现了一些问题 看看下面这个 SVG
  • MongoDB 自签名 SSL 连接:SSL 对等证书验证失败

    我已遵循本指南使用 PyMongo 的自签名 SSL 连接 作者 Wan Bachtiar https stackoverflow com questions 35790287 self signed ssl connection usin