2011-06-23 138 views
3

我有一個很好的工作通信器應用程序,用C#編寫。現在我需要實現到服務器的安全連接。我試過將Socket和TcpClient對象改成SslStream,但是我得到了一些錯誤。C#SSL安全套接字

首先,我使用makecert生成了一個.cer證書。 OpenSSL證書不適合我,因爲它們不包含私鑰。接下來,我創建的證書對象的服務器上,並將其綁定到SslStream:

X509Certificate serverCertificate = X509Certificate.CreateFromCertFile("ca.cer"); 
TcpClient clientSocket = this.tcpListener.AcceptTcpClient(); 
SslStream ssls = new SslStream(clientSocket.GetStream(), false); 
ssls.AuthenticateAsServer(serverCertificate, false, SslProtocols.Tls, true); 

在客戶端,我這樣做:

TcpClient client = new TcpClient(settings.IP, settings.Port);         
sslStream = new SslStream(client.GetStream(), false, 
    new RemoteCertificateValidationCallback(ValidateServerCertificate), null); 
sslStream.AuthenticateAsClient(settings.IP); 

public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
{ 
    if (sslPolicyErrors == SslPolicyErrors.None) 
     return true; 

    Console.WriteLine("Certificate error: {0}", sslPolicyErrors); 
    return false; 
} 

但AuthenticateAsClient函數拋出異常。我嘗試了幾個其他的方法參數,但沒有一個適用於我。

任何人都可以幫助我,或一步一步解釋如何將簡單的套接字變成安全的套接字?要清楚的是,SSL不是要求 - 如果有更簡單的方法來保證連接的安全,我可以使用它。


編輯:異常 消息如下:

The remote certificate is invalid according to the validation procedure. 

回答

3

有什麼異常?

我想你會得到例外,因爲你的客戶端證書從服務器被拒絕爲有效的(除非你做了必要的事情來設置信任)。

當您使用自簽名證書(由makecert創建的證書)時,您在創建SslStream對象時還必須提供客戶端證書驗證回調。使用此構造函數重載http://msdn.microsoft.com/en-us/library/ms145056.aspx

+0

對不起 - 「根據驗證過程,遠程證書無效。」 –

+1

用於自簽名證書。總是從證書驗證處理程序(ValidateServerCertificate)返回true – KRam

2

.CER文件通常包含沒有私鑰的證書。將它加載到服務器中將不起作用。你也需要一個私鑰。最簡單的方法是生成證書和密鑰並將它們一起保存爲PFX格式。然後從服務器上加載PFX中的證書和密鑰。

現在使用您的代碼只驗證服務器。這是你想要做什麼(即你不想在服務器上認證客戶端)?

+0

我聽說過這個問題(不包括私鑰),但我認爲我的.cer是好的。在這個錯誤之前,我得到了關於私鑰的例外。然後我用另一個程序生成證書文件,並通過了這個錯誤。 我需要d SSL來保護傳輸。認證並不是真的有必要。 Sory我的跛腳,但似乎我睡在關於安全的講座:) –

+0

@Matthew當然編輯這個問題改變了一切。你在sslPolicyErrors中得到了什麼? –