Самоподписанный сертификат в .NET, изменение алгоритма подписи с SHA-1 на что-то другое

Я получил великолепный ответ о создании самозаверяющего сертификата для использования субъектами Azure по адресу Создание самозаверяющего сертификата без внешних библиотек превосходным bartonjs.

Ниже приведен практически код, представленный в образце Azure. Однако я застрял на том, как можно изменить алгоритм подписи? Кажется, по умолчанию это SHA-1, я могу ошибаться, но, возможно, это должно быть явно установлено на что-то еще, например SHA-256.

public static X509Certificate2 CreateSelfSignedRsaCertificate(string subjectName, string friendlyName)
    {
        if(subjectName == null)
        {
            throw new ArgumentNullException(nameof(subjectName));
        }

        if(friendlyName == null)
        {
            throw new ArgumentNullException(nameof(friendlyName));
        }

        var keyParams = new CngKeyCreationParameters();
        keyParams.Parameters.Add(new CngProperty("Length", BitConverter.GetBytes(2048), CngPropertyOptions.Persist));
        using(var rsaKey = CngKey.Create(CngAlgorithm.Rsa, Guid.NewGuid().ToString(), keyParams))
        {
            using(RSA rsa = new RSACng(rsaKey))
            {
                var certRequest = new CertificateRequest(subjectName, rsa, HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1);

                //Explicitly not a CA.
                certRequest.CertificateExtensions.Add(new X509BasicConstraintsExtension(false, false, 0, false));

                certRequest.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.KeyEncipherment, true));

                //TLS Server EKU.
                certRequest.CertificateExtensions.Add(new X509EnhancedKeyUsageExtension(new OidCollection { new Oid("1.3.6.1.5.5.7.3.1") }, false));

                //SubjectAlternativeName extension.
                var sanBuilder = new SubjectAlternativeNameBuilder();
                sanBuilder.AddDnsName("localhost");
                certRequest.CertificateExtensions.Add(sanBuilder.Build());

                DateTimeOffset now = DateTimeOffset.UtcNow;
                var certificate = certRequest.CreateSelfSigned(notBefore: now, notAfter: now.AddDays(1)/*now.AddDays(365.25)*/);
                certificate.FriendlyName = friendlyName;

                return certificate;
            }
        }
    }

person Veksi    schedule 26.08.2017    source источник
comment
Код от bartonjs работает нормально. Ваш даже не компилируется. Я пробовал SHA256 и SHA512, а алгоритм подписи в самозаверяющем сертификате — sha256RSA или sha512RSA.   -  person pepo    schedule 27.08.2017
comment
Аргумент между ключом и дополнением подписи (в данном случае SHA512) определяет хэш в алгоритме подписи, поэтому это будет RSA-SSA-PKCS1_1.5-SHA-2-512. Значение Thumbprint по-прежнему будет SHA-1, поскольку отпечаток определяется как SHA-1 подписанного сертификата.   -  person bartonjs    schedule 27.08.2017
comment
Ах я вижу. Возможно, мне следовало добавить, что я просматривал это certlm задолго до прошлой ночи. Третья нижняя точка говорит об алгоритме подписи на моем языке (не на английском), поэтому я предположил, что он будет использоваться при подписи. Я думаю, что это отвечает на него. Есть еще один алгоритм хеширования подписи, который называется sha512, и третий алгоритм хеширования подписи, который называется sha512rsa. Вроде тогда все хорошо.   -  person Veksi    schedule 27.08.2017