MongoDB通过SSL连接:我在做什么错了?

时间:2018-07-23 23:45:31

标签: php mongodb database-administration

概述:我有一个运行PHP 7的应用程序服务器,并使用MongoDB PHP用户域库连接到运行MongoDB 3.6.x的单独数据库服务器。我有防火墙规则,禁止从本地和私有接口以外的所有来源访问MongoDB服务器(即禁止公共IP访问)。

通过PHP的连接如下所示:

$context_information = array(
    "ssl" => array(
        "allow_self_signed" => false,
        "verify_peer"       => true,
        "verify_peer_name"  => true,
        "verify_expiry"     => true,
        "cafile"            => "/path/to/ca_bundle"
));

$context = stream_context_create($context_information);
$connection = new MongoDB\Client(
    $host,
    array('ssl'=>true),
    array('context'=> $context)
);

我的MongoDB配置看起来像这样:

net:
  port: 27017
  bindIp: 127.0.0.1,10.138.196.241
  ssl:
    mode: requireSSL
    PEMKeyFile: /path/to/my_ca_signed_cert
    CAFile: /path/to/my_ca_bundle

my_ca_signed_cert是一个.pem文件,它是用我的openssl生成的RSA私钥以及CA提供的.crt文件(按照MongoDB手册中所述的方式)生成的。 cat mongodb.key mongodb.crt > mongodb.pemmy_ca_bundle是CA提供给我的.ca-bundle

此外,PHP上下文中描述的ca_bundle与MongoDB配置中的.ca-bundle文件相同。

问题:我继续收到以下错误消息:

  

[2018年7月23日16:33:33 America / Los_Angeles] PHP致命错误:未捕获的MongoDB \ Driver \ Exception \ ConnectionTimeoutException:未找到合适的服务器(设置了serverSelectionTryOnce):[TLS握手失败:错误:14090086:SSL例程:ssl3_get_server_certificate:certificate验证调用ismaster失败。 。

即使我注释掉MongoDB配置的CAFile行,此问题仍然存在。还要注意的是,如果将allow_self_signed注释掉,则将true设置为CAFile时,我可以成功连接,但是如果不注释,则不能成功连接。

最后,当尝试通过MongoDB shell连接时,出现以下错误:

  

2018-07-23T23:37:02.992 + 0000 E网络[thread1] SSL对等证书验证失败:无法获取颁发者证书

     

2018-07-23T23:37:02.992 + 0000 E查询[thread1]错误:用于SSL对等证书验证的套接字异常[CONNECT_ERROR]失败:无法获取颁发者证书:

     

connect@src/mongo/shell/mongo.js:251:13

     

@(connect):1:6

     

例外:连接失败

预期的行为::我不想使用客户端证书身份验证来连接数据库。我目前只想对流量进行加密。这意味着无需允许自签名证书即可连接到数据库。

注释:

  1. 我已在应用程序服务器上成功设置了用于HTTPS连接的证书。此外,在测试此问题本身引用的证书时,我已经成功使用openssl verify -CAfile /path/to/my_ca_bundle /path/to/my_ca_signed_cert对文件进行了验证。

  2. 在禁用SSL或启用自签名证书的情况下,应用程序代码中的所有内容均有效。

关于所有这些的文档在许多方面都令人难以置信,因此我不确定我的配置哪里出了问题。我应该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我认为您可以尝试将选项.order("abs(created_at - #{dt})")添加到ssl配置中。您的连接已加密,但忽略了证书身份验证。

allowConnectionsWithoutCertificates

更多信息在这里:

https://docs.mongodb.com/manual/reference/configuration-options/#net.ssl.allowConnectionsWithoutCertificates

答案 1 :(得分:1)

我决定再次解决这个问题,最终找到了解决方案。

首先,我需要将/path/to/my_ca_bundle移至/usr/share/ca-certificates/my_project/my_ca_bundle

第二,我需要用行/etc/ca-certificates.conf更新my_project/my_ca_bundle

第三,我需要运行sudo update-ca-certificates

最后,我需要从我的PHP流上下文中删除ssl.cafile选项(我似乎无法使其与该行配合使用)。

CAFile中的/etc/mongod.conf选项也是不必要的,除非它使用另一个答案中指出的allowConnectionsWithoutCertificates: true行,否则它是有问题的。

那是一团糟,但现在一切正常!