C#SSL服务器模式必须使用具有相应私钥的证书

时间:2014-04-13 16:00:53

标签: c# ssl https x509certificate handle

我将学习如何在服务器端处理C#中的HTTPS流量,并且在第一步中我遇到了一些麻烦。

以下是一些代码(http://pastebin.com/C4ZYrS8Q):

class Program
{
    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;
    }

    static void Main()
    {
        var tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8080);
        tcpListener.Start();
        var clientAccept = tcpListener.AcceptTcpClient();
        Thread.Sleep(1000);

        if (clientAccept.Available > 0)
        {
            var sslStream = new SslStream(clientAccept.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
            var certificate = new X509Certificate("path\server.pfx", "password");
            sslStream.AuthenticateAsServer(certificate);
        }

        Console.ReadLine();
    }
}
不要争辩! :)它只是测试代码,我只想在C#中实现SSL处理的一些基本步骤。

所以......问题发生在这一行:

sslStream.AuthenticateAsServer(certificate);

enter image description here

从俄语翻译为:   - SSL服务器模式必须使用具有相应私钥的证书。

我想,我已经使我的X509证书不正确,但再次检查:

makecert.exe -r -pe -n "CN=localhost" -sky exchange -sv server.pvk server.cer
pvk2pfx -pvk server.pvk -spc server.cer -pfx server.pfx -pi <password>

似乎X509的创作一切都很好,其他证据就是这条线很好用:

var certificate = new X509Certificate("path\server.pfx", "password");

程序并没有在上面的行上抛出异常。

那么,我的代码中SSL处理的问题是什么?如何处理作为服务器端的传入SSL流?

1 个答案:

答案 0 :(得分:13)

一切都很好,答案是使用X509Certificate2课而不是X509Certificate

并将您创建的证书添加到信任列表中。