2016-07-24 98 views
6

在关闭Parse服务器之前关闭它的过程中,我试图在Digital Ocean上设置一个简单的MongoDB实例。 (我正在使用它来代替mLab,因为我的需求非常有限 - 几MB的存储空间,每周几百个请求 - 而且这个mLab的成本相当高。)解析+ mongodb + SSL:“没有由对等提供的SSL证书”

我有mongod运行,并取得了一些进展,SSL感谢this guide使用Let's Encrypt,但现在我卡住了。解析的迁移工具说:“不可达的服务器,”如果我试图像这样在命令行上连接:

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' : 
[email protected]/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)解析不提供作为一个选项,所以必须有某种方式不要。

在此先感谢您的帮助。

回答

0

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

+0

“客户端必须在使用SSL时提供证书” - 这是否始终如此?应该取决于配置。用于配置SSL的mongodb教程mongod说: “如果客户端提供证书,证书必须是有效的证书。所有连接,包括那些没有提供证书的连接都使用SSL进行加密。“ 来源:https://docs.mongodb.com/manual/tutorial/configure-ssl/ – DukeOf1Cat

5

关键的错误信息是一个:

no SSL certificate provided by peer; connection rejected 

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

但我只是描述了某个时候被称为单向 TLS,而默认情况下,MongoDB的使双向相互TLS认证。这背后的想法是,也许MongoDB不想接受任何人的客户(公共网站的方式),但也希望验证客户端。

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

所以这个错误是说:“嘿,我希望我的客户提交一份TLS证书,但是你没有提供任何东西。“

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

If you want to bypass validation for clients that don’t present certificates, include the allowConnectionsWithoutCertificates run-time option with mongod and mongos. If the client does not present a certificate, no validation occurs. These connections, though not validated, are still encrypted using 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