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

B. *_*ing 7 php database-administration mongodb

概述:我有一个运行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)
);
Run Code Online (Sandbox Code Playgroud)

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

my_ca_signed_cert.pem使用我的openssl生成的RSA私钥生成的.crt文件,以及CA提供的文件,以MongoDB手册中描述的方式生成,例如cat mongodb.key mongodb.crt > mongodb.pem.my_ca_bundle.ca-bundle由CA提供给我的.

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

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

[23-Jul-2018 16:33:33 America/Los_Angeles] PHP致命错误:未捕获MongoDB\Driver\Exception\ConnectionTimeoutException:找不到合适的服务器(serverSelectionTryOnce设置):[TLS握手失败:错误:14090086:SSL例程:ssl3_get_server_certificate:证书验证失败,调用ismaster...

即使我注释掉CAFileMongoDB配置的行,这个问题仍然存在.另外值得注意的是,当设置allow_self_signedtrueif CAFile被注释掉时,我可以成功连接,但是当它被取消注释时不能连接.

最后,当尝试通过MongoDB shell进行连接时,我收到以下错误:

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

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

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

@(连接):1:6

异常:连接失败

预期行为:我不想使用客户端证书身份验证来连接到数据库.我目前想要的只是加密流量.这意味着能够在不允许自签名证书的情况下连接到数据库.

笔记:

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

  2. 当禁用SSL或启用自签名证书时,我的应用程序代码中的所有内容都有效.

关于所有这些的文档在许多方面都非常模糊,所以我不确定我的配置出错了.我应该考虑什么来解决这个问题?

B. *_*ing 1

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

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

其次,我需要/etc/ca-certificates.conf使用 line进行更新my_project/my_ca_bundle

第三,我需要跑步sudo update-ca-certificates

最后,我需要ssl.cafile从 PHP 流上下文中删除该选项(我似乎无法让它与此行一起工作)。

CAFile中的选项也是/etc/mongod.conf不必要的,并且是有问题的,除非它使用allowConnectionsWithoutCertificates: true其他答案中指出的行。

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