我有一个功能良好的通信应用程序,使用C#编写。现在我需要实现与服务器的安全连接。我尝试将Socket和TcpClient对象更改为SslStream,但是遇到了一些错误。
首先,我使用makecert生成了一个.cer证书。OpenSSL证书对我来说不起作用,因为它们不包括私钥。接下来,在服务器上创建了一个证书对象,并将其绑定到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.