2011-06-23 98 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中得到了什么? –