У меня есть требование генерировать хэшированные сертификаты SHA1 для старой устаревшей системы, которая не поддерживает SHA256. Я хорошо знаю, что хеширование MD5 и SHA1 в криптосценарии ios не рекомендуется, но это внешнее требование.
Я использую. NET Framework 4.7.2 и его новый CertificateRequest class.
Вот соответствующий фрагмент кода:
using (var rsa = RSA.Create(2048))
{
var subjectName = "CN=sampleName";
var certificateRequest = new CertificateRequest(subjectName, rsa, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
var selfSignedCertificate = certificateRequest.CreateSelfSigned(DateTime.UtcNow, DateTime.UtcNow.AddYears(10));
var certAsBytes = selfSignedCertificate.Export(X509ContentType.Pfx, "fakePassword");
File.WriteAllBytes("cert-sha1.pfx", certAsBytes);
}
При вызове certificateRequest.CreateSelfSigned
выдается следующее исключение:
'SHA1' is not a known hash algorithm.
Parameter name: hashAlgorithm
Actual value was SHA1.
Соответствующая точка в трассировке стека:
...
at System.Security.Cryptography.X509Certificates.RSAPkcs1X509SignatureGenerator.GetSignatureAlgorithmIdentifier(HashAlgorithmName hashAlgorithm)
at System.Security.Cryptography.X509Certificates.TbsCertificate.Encode(X509SignatureGenerator signatureGenerator, HashAlgorithmName hashAlgorithm)
at System.Security.Cryptography.X509Certificates.TbsCertificate.Sign(X509SignatureGenerator signatureGenerator, HashAlgorithmName hashAlgorithm)
at System.Security.Cryptography.X509Certificates.CertificateRequest.Create(X500DistinguishedName issuerName, X509SignatureGenerator generator, DateTimeOffset notBefore, DateTimeOffset notAfter, Byte[] serialNumber)
at System.Security.Cryptography.X509Certificates.CertificateRequest.CreateSelfSigned(DateTimeOffset notBefore, DateTimeOffset notAfter)
at Tests.Sha1Test()
Из браузера API . NET для конструктора, который я использую, я не вижу ничего, почему это не следует не работает, даже если не рекомендуется. Использование MD5 создает похожее исключение. SHA256 и выше работают нормально.
Класс CertificateRequest
также не отображается в справочном источнике (может быть, потому что он слишком новый?), Поэтому у меня нет идей.