Режим сервера С# SSL должен использовать сертификат с соответствующим закрытым ключом

Я собираюсь научиться обрабатывать 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();
    }
}

Не спорь!:) Это тестовый код только там, где я просто хочу получить некоторые основные шаги с обработкой 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-hanlding в моем коде и как я могу обрабатывать входящий поток SSL как серверный?

+7
источник поделиться
1 ответ

Все в порядке, ответ заключается в использовании класса X509Certificate2 вместо X509Certificate.

И добавьте в список доверия ваш созданный сертификат.

+10
источник

Связанные вопросы


Похожие вопросы

Посмотрите другие вопросы по меткам или Задайте вопрос