Мне нужно создать самозаверяющий сертификат 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