C# SSL安全套接字

3
我有一个功能良好的通信应用程序,使用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.
2个回答

3

什么是异常?

我猜测您之所以收到异常,是因为您的客户端证书被服务器拒绝为有效证书(除非您采取了必要的措施建立信任)。

当您使用自签名证书(由makecert创建的证书)时,创建SslStream对象时还需要提供一个客户端证书验证回调函数。请使用此构造函数重载:http://msdn.microsoft.com/en-us/library/ms145056.aspx


抱歉 - “根据验证程序,远程证书无效。” - Mateusz Chromiński
1
对于自签名证书,请在证书验证处理程序(ValidateServerCertificate)中始终返回true。 - KMeda

3

.CER文件通常只包含证书而没有私钥。将其加载到服务器上是无法工作的。您还需要一个私钥。最简单的方法是生成证书和密钥,并将它们一起保存为PFX格式。然后从PFX加载证书和密钥到服务器。

现在,您的代码仅验证服务器。这是您想要做的吗(即您不想在服务器上验证客户端)?


我听说过这个问题(私钥未包含),但我认为我的 .cer 文件没问题。在出现这些错误之前,我遇到了有关私钥的异常。之后,我用另一个程序生成了证书文件,并通过了此错误。我只需要 SSL 来保证安全传输。身份验证并不是真正必要的。对不起,我好像在有关安全性的讲座上睡着了,所以有点白痴。 - Mateusz Chromiński
@Matthew 确实编辑问题改变了一切。你在 sslPolicyErrors 中得到了什么? - Eugene Mayevski 'Callback

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接