MongoDB ssl通过C#驱动程序:根据验证程序,远程证书无效

时间:2016-01-11 16:15:47

标签: c# mongodb ssl

我正在尝试使用从C#客户端到MongoDB的X.509自签名证书来测试身份验证。我使用ssl在控制台窗口中运行 mongod 成功 ,并使用 mongo 从另一个控制台窗口连接到它命令:

mongod --clusterAuthMode x509 --sslMode requireSSL --sslPEMKeyFile mongodb.pem --sslCAFile client.pem

mongo --ssl --sslCAFile mongodb.pem --sslPEMKeyFile client.pem

证书文件是通过these instructions生成的。

MongoDB驱动程序需要我生成的pfx文件:

openssl pkcs12 -export -in client.pem -inkey client-cert.key -out client.pfx

实际代码如下:

    private static void TryConnect()
    {
        var cert = new X509Certificate2(@"C:\Program Files\MongoDB\Server\3.2\bin\client.pfx", "test");

        var settings = new MongoClientSettings
        {
            Credentials = new[]
            {
                MongoCredential.CreateMongoX509Credential("subject= emailAddress=test@test.com,CN=127.0.0.1,OU=Test,O=Test,L=Cph,C=DK")
            },
            SslSettings = new SslSettings
            {
                ClientCertificates = new[] { cert },
            },
            UseSsl = true
        };

        settings.Server = new MongoServerAddress("127.0.0.1");            

        MongoClient client = new MongoClient(settings);
        var db = client.GetServer().GetDatabase("test");

        db.CreateCollection("test");           
    }

最后一行抛出异常:无法连接到服务器127.0.0.1:27017:根据验证程序,远程证书无效。

有谁知道如何使这个工作?

2 个答案:

答案 0 :(得分:2)

检查CRL是否有效。

以下链接描述了HTTP URL中的错误配置,导致此问题出现在另一个场景中(与mongodb无关)

http://www.coretekservices.com/2014/jun/26/certificate-services-did-not-start-sub-ca

您可以通过验证证书并检查策略错误(请注意警告)来获取更多信息

警告:请勿在生产中使用!!!修复CERT ISSUE INSTEAD

 settings.SslSettings = new SslSettings
        {
            ClientCertificates = new[] { cert },
            ServerCertificateValidationCallback = delegate (object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
            {
                foreach (var item in chain.ChainElements)
                {
                    foreach (var elemStatus in item.ChainElementStatus)
                    {
                        Console.WriteLine( item.Certificate.Subject + "->" + elemStatus.StatusInformation);
                    }
                }

                return true; //NOT FOR PRODUCTION: this line will bypass certificate errors.
            }
       }

答案 1 :(得分:0)

Nambi's answer帮助我找出问题所在。自签名根证书不受信任。在将 mongodb-cert.crt 添加到证书(本地计算机)管理单元下的受信任的根证书颁发机构后,问题就消失了。