Parse + mongodb + SSL:"没有同行提供的SSL证书"

Dav*_*man 8 ssl mongodb parse-platform

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

由于本指南使用了Let's Encrypt,我已经运行了mongod,并且已经使用SSL取得了一些进展,但现在我被卡住了.Parse的迁移工具说,"没有可达的服务器",如果我尝试在命令行上连接如下:

mongo --ssl -u editAdmin -p "<password-here>" --host mydb.myhost.com dbname
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

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
Run Code Online (Sandbox Code Playgroud)

服务器日志报告:

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)
Run Code Online (Sandbox Code Playgroud)

因此,这表明客户需要提供证书,但(a)我不知道如何提供证书,而(b)Parse没有提供这样的选项,因此必须有某种方式不这样做.

在此先感谢您的帮助.

Jos*_*ick 9

关键错误消息是这一个:

no SSL certificate provided by peer; connection rejected
Run Code Online (Sandbox Code Playgroud)

当您在MongoDB上启用TLS/SSL时,MongoDB客户端现在可以通过将MongoDB的TLS/SSL证书(由文件中的PEMKeyFile属性指定mongod.conf)与您提供的公共证书颁发机构证书进行比较来验证MongoDB服务器是否声称是谁.到MongoDB客户端以指示您信任的证书颁发机构.

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

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

所以这个错误就是说"嘿,我希望我的客户提供TLS证书,但你没有提出任何东西."

修复它的方法在配置mongod和mongos for TLS/SSL中描述:

如果要绕过不提供证书的客户端的验证,请包含allowConnectionsWithoutCertificatesmongod和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
Run Code Online (Sandbox Code Playgroud)


Exo*_*imp -1

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