2013-09-25 219 views
0

我試圖建立與使用證書驗證的C#驅動程序MongoDB的安全連接,但我得到這個錯誤:MongoDB的C#SSL客戶端證書

Unable to connect to server localhost:27017: Unable to read data from the transport connection: An established connection was aborted by the software in your host machine..

繼承人從MongoDB的錯誤:

[initandlisten] connection accepted from 127.0.0.1:26163 #2 (1 connection now open) 
[conn2] ERROR: no SSL certificate provided by peer; connection rejected 
[conn2] SocketException handling request, closing client connection: 9001 socket exception [CONNECT_ERROR] 

當我通過mongo shell連接到MongoDB並使用證書工作時。

var connectionString = "mongodb://localhost"; 
var clientSettings = MongoClientSettings.FromUrl(new MongoUrl(connectionString)); 
clientSettings.SslSettings = new SslSettings(); 
clientSettings.UseSsl = true; 
clientSettings.SslSettings.ClientCertificates = new List<X509Certificate>() 
    { 
     new X509Certificate("cert.pem") 
    }; 
clientSettings.SslSettings.EnabledSslProtocols = SslProtocols.Default; 
clientSettings.SslSettings.ClientCertificateSelectionCallback = 
    (sender, host, certificates, certificate, issuers) => clientSettings.SslSettings.ClientCertificates.ToList()[0]; 
clientSettings.SslSettings.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true; 
var client = new MongoClient(clientSettings); 

有沒有人知道如何讓這個工作?

+0

它,如果你使用的機器工作名稱而不是本地主機? – WiredPrairie

+0

不,我嘗試過使用IP和主機名,它仍然會產生相同的錯誤。 – Stegzilla

回答

3

意識到這是過時的,但爲他人謀取利益......

如果你不處理證書吊銷列表,你需要把那個掀起,因爲它是默認啓用。

clientSettings.SslSettings.CheckCertificateRevocation = false; 

接下來,您提供給驅動程序的X509Certificate2必須包含私鑰。 .NET似乎沒有選取pem文件中的私鑰,所以您需要提供.pfx格式的證書幷包含密碼。

要OpenSSL中創建一個PFX文件:

openssl pkcs12 -export -in mycert.cer -inkey mycert.key -out mycert.pfx 

的OpenSSL將提示您輸入導出密碼,請使用創建X509Certificate2對象時:

X509Certificate2 cert = new X509Certificate2("mycert.pfx","mypassphrase");