Понимание самоподписанных сертификатов в c# - PullRequest
0 голосов
/ 14 июля 2020

Недавно я наткнулся на этот c# код:

var dn = new X500DistinguishedName($"CN={_appSettings.CommonName};OU={_appSettings.OrganizationalUnit}", X500DistinguishedNameFlags.UseSemicolons);
SubjectAlternativeNameBuilder sanBuilder = new SubjectAlternativeNameBuilder();
sanBuilder.AddUri(new Uri($"urn:{_appSettings.ApplicationUri}"));

using (RSA rsa = RSA.Create(2048))
{
    var request = new CertificateRequest(dn, rsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);

    request.CertificateExtensions.Add(sanBuilder.Build());

    var selfSignedCert = request.CreateSelfSigned(new DateTimeOffset(DateTime.UtcNow.AddDays(-1)), new DateTimeOffset(DateTime.UtcNow.AddDays(3650)));

    ...
}

...

При внимательном рассмотрении параметров конструктора CertificateRequest ключ rsa описывается как:

RSA ключ, материал publi c которого будет включен в сертификат или запрос сертификата. Если вызывается метод CreateSelfSigned (DateTimeOffset, DateTimeOffset), этот ключ используется как закрытый ключ.

Я не совсем понимаю выделенную жирным шрифтом часть. Означает ли это, что при самоподписании сертификата сертификат подписывается с использованием данного ключа RSA И добавляет тот же ключ, что и publi c ключ к сертификату?

В моем понимании для TLS, у нас есть две пары ключей publi c, одна для подписи, а другая для шифрования. CA подписывает сертификат своим закрытым ключом и предлагает ключ publi c клиентам для проверки подписи, расшифровывая его с помощью ключа publi c, тогда как поставщик услуги предлагает ключ publi c, который клиенты используют для шифрования свои ключи сначала в рукопожатии tls, которое после этого расшифровывается с помощью закрытого ключа поставщика услуг.

Однако в приведенном выше примере кода мы создаем сертификат, который содержит что именно? Ключ publi сервера c предназначен для шифрования, а какой ключ для расшифровки подписи?

...