Недавно я наткнулся на этот 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 предназначен для шифрования, а какой ключ для расшифровки подписи?