【发布时间】:2011-06-23 09:24:52
【问题描述】:
我有一个用 C# 编写的可以正常工作的通信器应用程序。现在我需要实现与服务器的安全连接。我尝试将 Socket 和 TcpClient 对象更改为 SslStream,但出现了一些错误。
首先,我使用 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.
【问题讨论】:
标签: c# sockets ssl ssl-certificate sslstream