AuthenticateAsServer. Удаленный сертификат недействителен в соответствии с процедурой проверки

Я пытаюсь создать тестовое соединение клиент/сервер, используя следующий код:

    static void Main(string[] args)
    {
        var listenerThread = new Thread(ListenerThreadEntry);
        listenerThread.Start();

        Thread.Sleep(TimeSpan.FromSeconds(1));

        var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
        socket.Connect("localhost", Port);

        var rawStream = new NetworkStream(socket);
        var stream = new SslStream(rawStream, false, VerifyServerCertificate);
        var certificate = new X509Certificate(CertsPath + @"test.cer");
        var certificates = new X509CertificateCollection(new[] { certificate });
        stream.AuthenticateAsClient("localhost", certificates, SslProtocols.Tls, false);

        Thread.Sleep(TimeSpan.FromSeconds(1));
    }

    private static bool VerifyServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        return true;
    }

    static void ListenerThreadEntry()
    {
        var listener = new TcpListener(IPAddress.Any, Port);
        listener.Start();

        var client = listener.AcceptTcpClient();
        var serverCertificate = new X509Certificate2(CertsPath + @"\test.pfx");
        var sslStream = new SslStream(client.GetStream(), false);
        sslStream.AuthenticateAsServer(serverCertificate, true, SslProtocols.Tls, false);

        Thread.Sleep(TimeSpan.FromSeconds(10));
    }

И получение сообщения об ошибке "Удаленный сертификат недействителен в соответствии с процедурой проверки" в методе AuthenticateAsServer. Сертификат был создан и сохранен в файл с помощью следующих команд:

makecert.exe -r -pe -n "CN=localhost" -a sha1 -sky exchange -sv test.pvk test.cer
pvk2pfx -pvk test.pvk -spc test.cer -pfx test.pfx

Что я пропустил?

Ответ 1

Я не вижу, где в вашем процессе вы добавляете доверие к сертификату, который вы используете для аутентификации. Передача false, поскольку параметр 4 в AuthenticateAsServer() пропускает проверку для отзыва, она не пропускает проверку для доверия в целом.

Итак, у вас есть следующие варианты, чтобы заставить его работать:

  • Не создавайте сертификат самостоятельно, но создайте его с помощью центра сертификации, которому по умолчанию доверяют Windows. Это будет стоить немного денег, но там также есть несколько дешевых ЦС, это не обязательно должен быть сертификат Thawte.
  • Добавить доверие к сертификату, импортировав его в список личных сертификатов
  • Если вы уже создали самозаверяющий сертификат ЦС, который уже был добавлен в список доверенных корневых сертификатов (что обычно бывает в компаниях или организациях), подпишите свой сертификат с сертификатом ЦС
  • Не аутентифицировать вообще (но, скорее всего, вы этого не хотите)

Ответ 2

проверьте эти шаги, кажется, работает,

1)First save the certificate in a file
2)Run MMC
3)Open the Certificate Manager (certmgr.msc in C:\Windows\System32)
4)You will see it opens 'Certificates - Current User'
5)In the menu, choose File, Add/Remove Snap-In
6)Now press Add, select 'Certificates' and select 'Computer Account'
7)Select the Local Computer
8)Now you have two snap-ins:
9)Certificates - Current User
10)Certificates (Local Computer)
11)Now import the certificate in "Certificates (Local Computer)\Trusted Root Certificates\Certificates"