【问题标题】:Parse + mongodb + SSL: "no SSL certificate provided by peer"Parse + mongodb + SSL:“peer 没有提供 SSL 证书”
【发布时间】:2022-03-11 05:42:24
【问题描述】:

在 Parse 关闭之前迁移其服务器的过程中,我试图在 Digital Ocean 上设置一个简单的 MongoDB 实例。 (我使用它而不是 mLab 是因为我的需求非常有限——几 MB 的存储空间,每周几百个请求——而 mLab 的成本相当高。)

我已经运行了 mongod,并且由于 this guide 使用 Let's Encrypt 在 SSL 方面取得了一些进展,但现在我被卡住了。 Parse 的迁移工具显示“无法访问服务器”,如果我尝试像这样在命令行上连接:

mongo --ssl -u editAdmin -p "<password-here>" --host mydb.myhost.com dbname

我收到此错误:

MongoDB shell version: 3.2.7
connecting to: mydb.myhost.com:27017/dbname
2016-07-24T10:31:38.814-0700 E QUERY [thread1] Error: network error while attempting to run command 'isMaster' on host 'mydb.myhost.com:27017' :
connect@src/mongo/shell/mongo.js:231:14
@(connect):1:6

exception: connect failed

服务器日志报告:

2016-07-24T13:32:44.357-0400 I NETWORK [initandlisten] connection accepted from 12.345.67.89:33351 #39 (1 connection now open)
2016-07-24T13:32:44.390-0400 E NETWORK [conn39] no SSL certificate provided by peer; connection rejected
2016-07-24T13:32:44.390-0400 I NETWORK [conn39] end connection 12.345.67.89:33351 (0 connections now open)

因此这表明客户需要提供证书,但是 (a) 我不知道如何提供证书,并且 (b) Parse 没有将其作为选项提供,因此必须有某种方法不提供.

提前感谢您的帮助。

【问题讨论】:

    标签: mongodb ssl parse-platform


    【解决方案1】:

    关键的错误信息是这样的:

    no SSL certificate provided by peer; connection rejected
    

    当您在 MongoDB 上启用 TLS/SSL 时,MongoDB 客户端现在可以通过比较 MongoDB 的 TLS/SSL 证书(由 mongod.conf 文件中的 PEMKeyFile 属性指定)来验证 MongoDB 服务器是它声称的身份。根据您提供给 MongoDB 客户端的公共证书颁发机构证书,以指示您信任哪个证书颁发机构。

    但我刚才描述的有时称为单向 TLS,而默认情况下,MongoDB 启用双向双向 TLS 身份验证。这背后的想法是,MongoDB 可能不想接受来自任何人的客户端请求(公共网站可能的方式),但也想对客户端进行身份验证。

    在 TLS Mutual Auth 中,我上面提到的同一证书颁发机构将颁发客户端证书,MongoDB 服务器将检查客户端的证书以确保它确实由相关证书颁发机构颁发并且它是有效的(例如没有过期)。

    所以这个错误是说“嘿,我希望我的客户出示 TLS 证书,但你没有出示任何东西。”

    修复它的方法在Configure mongod and mongos for TLS/SSL描述:

    如果您想绕过对不存在的客户端的验证 证书,包括 allowConnectionsWithoutCertificates 运行时 mongod 和 mongos 的选项。如果客户不提供 证书,不进行验证。这些联系虽然不是 经过验证,仍然使用 SSL 加密。

    当然,您也可以在mongod.conf 文件中指定:https://docs.mongodb.com/manual/reference/configuration-options/#net.ssl.allowConnectionsWithoutCertificates

    我的首选解决方案如下所示:

    net:
      port: 27017
      bindIp: 172.0.0.1 # Set this to whatever your private IP address is
      ssl:
         mode: "requireSSL"
         PEMKeyFile: "/path/to/tls/private/key"
         CAFile: "/path/to/ca/public/cert"
         disabledProtocols: "TLS1_0,TLS1_1"
         allowConnectionsWithoutCertificates: true # <-- The line to add to your config
    

    【讨论】:

      【解决方案2】:

      您的命令正在使用 SSL 选项(我假设 Parse 也在这样做),因此您正在尝试使用 SSL 进行连接。客户端在使用 SSL 时必须提供证书。 https://docs.mongodb.com/manual/tutorial/configure-ssl-clients/这个链接解释了如何做到这一点,还特别提到了你的问题

      【讨论】:

      • “客户端在使用 SSL 时必须提供证书”——这总是正确的吗?它应该取决于配置。在 mongod 中配置 SSL 的 mongodb 教程说:“如果客户端出示证书,则证书必须是有效证书。所有连接,包括那些没有出示证书的连接,都使用 SSL 加密。”来源:docs.mongodb.com/manual/tutorial/configure-ssl
      【解决方案3】:

      只要关注这个tutorial,一切都在那里,我知道肯定是因为我在关注它,现在我在没有任何先前知识的情况下运行 parse-server... 我建议您使用没有 SSL 证书的 MongoDB 连接并且只允许对它进行 localhost 查询 - 所以只有在同一台机器上运行的解析服务器才能访问这个数据库......

      【讨论】:

      • 这并没有回答原来的问题,除了教程特别提到迁移不会在没有 SSL 的情况下工作
      • 我不知道,那是半年前,但我只是在 http 上迁移了我的应用程序,它可能不在那个教程中,但肯定是有可能的 :-),我记得你有修改 /etc/mongo.conf 以禁用 SSL,您必须将其写入“迁移 url”以省略 ssl
      猜你喜欢
      • 2013-07-20
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多