php - MongoDB 通过 SSL 连接:我做错了什么?
问题描述
概述:我有一个运行 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.pem
. my_ca_bundle
是.ca-bundle
CA 提供给我的。
此外,ca_bundle
PHP 上下文中描述的.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 失败。. .
即使我注释掉CAFile
MongoDB 配置的行,这个问题仍然存在。另外值得注意的是,当设置allow_self_signed
为true
ifCAFile
被注释掉时,我可以成功连接,但在未注释时不能。
最后,当尝试通过 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] 失败:无法获取颁发者证书:
连接@src/mongo/shell/mongo.js:251:13
@(连接):1:6
异常:连接失败
预期行为:我不想使用客户端证书身份验证来连接数据库。我目前想要的只是对流量进行加密。这意味着无需允许自签名证书即可连接到数据库。
笔记:
我在应用程序服务器上成功设置了一个用于 HTTPS 连接的证书。此外,在测试此问题本身中引用的证书时,我已使用
openssl verify -CAfile /path/to/my_ca_bundle /path/to/my_ca_signed_cert
.当 SSL 被禁用或在允许自签名证书时启用时,我的应用程序代码中的所有内容都有效。
所有这些的文档在很多方面都非常模糊,所以我不确定我的配置哪里出错了。我应该研究什么来解决这个问题?
解决方案
我认为您可以尝试将选项添加allowConnectionsWithoutCertificates
到 ssl 配置。您的连接已加密,但忽略了证书身份验证。
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
allowConnectionsWithoutCertificates: true
更多信息在这里:
推荐阅读
- c++ - 现代 C++ 中的动态数组
- visual-studio-code - Visual Studio 代码 - 远程 ssh
- git - 将包含多个 git 存储库的文件夹推送到 github
- python - usb.core.USBError:[Errno 5] 输入/输出错误
- java - Java 记录是否打算最终成为值类型?
- java - Java Spring框架拦截器问题
- symfony - Symfony 4 API 平台仍然存在子问题?
- azure-data-factory - 是否有根据 Azure 映射数据流中的连续性对中断序列进行分组的规定
- javascript - 如何使用 id/class 从 css 到 json 块。json块用于JS代码
- deployment - 如何将 Oracle Forms 应用程序部署到 Oracle Web 逻辑服务器