Как создать X509Certificate2 с помощью PrivateKey в .NET Standard 2.0/Core 2.1?C#

Место общения программистов C#
Ответить
Anonymous
 Как создать X509Certificate2 с помощью PrivateKey в .NET Standard 2.0/Core 2.1?

Сообщение Anonymous »

Мы генерируем несколько самозаверяющих сертификатов для тестирования с помощью BouncyCastle, но код выдает исключение, когда мы пытаемся добавить закрытый ключ к сертификату. Вот рассматриваемый код:

Код: Выделить всё

private static X509Certificate2 CreateCertificate(string subject, DateTimeOffset notBefore, DataTimeOffset notAfter, string issuer, AsymmetricKeyParamter issuerPrivateKey)
{
// Setup
X509V3CertificateGenerator certGenerator = new X509V3CertificateGenerator();
SecureRandom random = new SecureRandom(new CryptoApiRandomGenerator());

RsaKeyPairGenerator keyPairGenerator = new RsaKeyPairGenerator();
keyPairGenerator.Init(new KeyGenerationParameters(random, KeyStrength));

// Randomly generate a serial number
BigInteger serialNumber = BigIntegers.CreateRandomInRange(BigInteger.One, BigInteger.ValueOf(long.MaxValue), random);
certGenerator.SetSerialNumber(serialNumber);

// Set the issuer and subject names
X509Name issuerName = new X509Name(issuer);
X509Name subjectName = new X509Name(subject);
certGenerator.SetIssuerDN(issuerName);
certGenerator.SetSubjectDN(subjectName);

// Set the validity period
certGenerator.SetNotBefore(notBefore.UtcDateTime);
certGenerator.SetNotAfter(notAfter.UtcDateTime);

// Randomly generate the public key
AsymmetricCipherKeyPair subjectKeyPair = keyPairGenerator.GenerateKeyPair();
certGenerator.SetPublicKey(subjectKeyPair.Public);

// Generate the signed certificate
ISignatureFactory signatureFactory = new Asn1SignatureFactory(SHA256RSASignatureAlgorithm, issuerPrivateKey ?? subjectKeyPair.Private, random);
X509Certificate2 certificate = new X509Certificate2(certGenerator.Generate(signatureFactory).GetEncoded());

// Include the private key with the response
// ERROR HERE!
certificate.PrivateKey = DotNetUtilities.ToRSA(subjectKeyPair.Private as RsaPrivateCrtKeyParameters);

return certificate;
}
Этот код находится в библиотеке, предназначенной для .NET Standard 2.0, и эта библиотека является зависимостью двух разных приложений: одно предназначено для .NET Core 2.1, а другое — для .NET Framework 4.7. 2. Я считаю, что в приложении .NET Framework это работает нормально, но в приложении .NET Core я получаю исключение с таким сообщением в указанной выше строке:

Операция не поддерживается на этой платформе.

Очевидно, это ожидаемое поведение в .NET Core. Мне известен метод CopyWithPrivateKey, упомянутый в этом вопросе, который теоретически мне следует использовать. Однако этот метод не поддерживается в .NET Standard 2.0 (обратите внимание на ошибку вверху страницы, указывающую на перенаправление). Кроме того, в настоящий момент приложение .NET Framework невозможно преобразовать в .NET Core из-за некоторых других зависимостей, которыми является .NET Framework. Согласно этому документу, .NET Standard 2.1 вообще не поддерживается .NET Framework, а это означает, что я не могу выполнить обновление до .NET Standard 2.1 и использовать CopyWithPrivateKey!
Как создать X509Certificate2 с закрытым ключом в .NET Standard 2.0 способом, совместимым с .NET Core?

Подробнее здесь: https://stackoverflow.com/questions/597 ... 0-core-2-1
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»