.NET - Как самостоятельно подписать SSL-сертификат для сокетной связи? - PullRequest
0 голосов
/ 22 мая 2019

Мне нужно создать самозаверяющий сертификат SSL, который будет использоваться для связи через сокеты в C #.В идеале код должен быть чистым .NET-кодом без какой-либо зависимости от внешних библиотек.

Сертификат SSL создается с использованием этого кода:

public static X509Certificate2 Create(string host)
{
    // Generate an asymmetric key pair.
    var ecdsa = ECDsa.Create();

    // Request a certificate with the common name as the host using the key pair.
    // Common Name (AKA CN) represents the server name protected by the SSL certificate.
    var request = new CertificateRequest($"cn={host}", ecdsa, HashAlgorithmName.SHA512);

    var validFrom = DateTimeOffset.UtcNow;
    var validUntil = DateTimeOffset.UtcNow.AddYears(5);

    var certificate = request.CreateSelfSigned(validFrom, validUntil);
    var certificateBytes = certificate.Export(X509ContentType.Pfx);

    return new X509Certificate2(certificateBytes);
}

Код вызывается здесь:

// host = "www.google.com"
var serverCertificate = SslCertificate.Create(host);

var clientSslStream = new SslStream(client.Stream, false);
await clientSslStream.AuthenticateAsServerAsync(serverCertificate, false, SslProtocols.Tls12, false);

Вызов AuthenticateAsServerAsync вызывает исключение:

System.Security.Authentication.AuthenticationException
A call to SSPI failed, see inner exception.
System.ComponentModel.Win32Exception:
The client and server cannot communicate, because they do not possess a common algorithm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...