我有一个很好的工作通信器应用程序,用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.
对不起 - “根据验证过程,远程证书无效。” –
用于自签名证书。总是从证书验证处理程序(ValidateServerCertificate)返回true – KRam