无法使用带有服务器 CA 验证的 TLS 连接到 AWS 数据库

Dav*_*d G 8 ssl mongodb amazon-web-services asp.net-core aws-documentdb-mongoapi

AWS 文档指出,要连接到我的 DocumentDB 集群,我需要使用以 so 结尾的查询字符串?ssl_ca_certs=rds-combined-ca-bundle.pem&replicaSet=rs0这是我的客户应该验证的根证书链。我不应该需要客户证书

使用 MongoDB C# 驱动程序和此特定查询,.pem文件位于同一目录中,我无法建立连接。如果我使用.pem来自 Mongo Shell的相同文件和查询字符串,我可以正确连接到我的数据库。它仅在我的 .net 核心应用程序中不起作用,该应用程序也在 AWS 上运行。

通过从集群中删除 TLS 并ssl_ca_certs从查询中删除选项,我可以正确连接到我的集群。

我以为我可以将我的.pem文件转换为.pfxusing openssl,但我必须提供.pfx密码并且MongoDB 文档指出

加载带有密码的证书时,PrivateKey 属性必须不为空。如果该属性为空,则表示您的证书不包含私钥,不会传递给服务器。

如何使用Amazon AWS 提供.pem文件通过C# MongoDB 驱动程序连接到我的数据库?

小智 5

###通过带有 SSL 的简单 .Net 控制台应用程序连接到文档数据库。

->首先,通过将参数 tls 设置为“enabled”,在文档数据库集群上启用 SSL。确保重新启动集群的编写器节点以重新启动整个集群,以便应用参数组更改。默认情况下,启动新的 Doc DB 集群时会启用 TLS。

->在您的环境中设置 SSL 证书:

1) 从以下链接在源 Windows 计算机上下载 PKCS#7 SSL 证书:

https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.p7b

2)单击“开始”菜单,单击“运行”并输入 mmc

3)在MMC中,文件->添加/删除管理单元。

4) 从管理单元列表中选择证书,然后单击添加。

5) 受信任的 CA 证书应位于本地计算机存储中,因此选择“计算机帐户”单选按钮,单击“下一步”,然后选择“本地计算机”。单击“下一步”,然后单击“完成”。

6)现在,从左侧窗格(在控制台根目录下),您将看到“证书”选项。单击它。

7)将出现一个列表,右键单击“受信任的根证书颁发机构”,然后选择“所有任务”->“导入”

8)在打开的窗口中,单击下一步,浏览步骤 1 中下载的证书(.p7b)文件(如果找不到,请从文件类型下拉列表中选择所有文件),然后继续单击“下一步”,最后单击“完成”。然后保存配置。

-> 然后写了下面的代码:

---------------------------------------------------

using MongoDB.Bson;
using MongoDB.Driver;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
namespace FirstDocDB
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var connectionString = "mongodb://pulkit:password@ClusterID:27017/?ssl=true&sslVerifyCertificate=true&replicaSet=rs0";
            var client = new MongoClient(connectionString);
            var database = client.GetDatabase("test");
            var collection = database.GetCollection("stuff");
            var document = collection.Find(new BsonDocument()).FirstOrDefault();
            Console.WriteLine(document.ToString());
        }
    }
}

---------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

->构建并运行后,我成功地获取了名为“stuff”的集合中的文档作为输出: { "_id" : ObjectId("5c5a63b10cf861158c1d241c"), "hello" : "world" }

因此,按照上述步骤后,我成功地使用 .Net 的 Mongo 驱动程序连接到文档数据库。


Kan*_*edi 0

尝试将 RDS CA 文件添加到您的 C# 信任存储中。

            X509Store store = new X509Store(StoreName.Root);
            X509Certificate2 ca = new X509Certificate2(<path_to_rds-combined-ca-bundle.pem>);
            try {
                store.Open(OpenFlags.ReadWrite);
                store.Add(ca);
            } catch (Exception ex) {
                Console.WriteLine("Root certificate import failed: " + ex.Message);
                throw;
            } finally {
                store.Close();
            }
Run Code Online (Sandbox Code Playgroud)