我正在尝试使用从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:根据验证程序,远程证书无效。
有谁知道如何使这个工作?
答案 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 添加到证书(本地计算机)管理单元下的受信任的根证书颁发机构后,问题就消失了。