Мне необходимо создать сертификат ECDSA «Клиент», подписанный сертификатом «Root» (самоподписанный, ECDSA).«Корневой» сертификат был создан, как описано в Преобразование параметров эллиптической кривой (от BC к MS) .
Для создания «Клиентского» сертификата (подписанного «Root») можно использовать слегка измененный алгоритм.,Разница заключается в том, что закрытый ключ (используемый для подписи открытого ключа из пары ключей, сгенерированный для сертификата «Клиент») должен предоставляться «извне» - это закрытый ключ сертификата «Корень».Но это проблема.Я не могу найти способ, как получить и перевести закрытый ключ к типу Org.BouncyCastle.Crypto.Parameters.ECPrivateKeyParameters
, который можно было бы передать фабрике подписи.
// 1. get private-key of "Root" certificate from existing certificate:
byte[] msRootCertData = File.ReadAllBytes(@"c:\root_ecdsa_cert.pfx");
X509Certificate2 msRootCert = new X509Certificate2(msRootCertData);
ECDsaCng msRootPrivateKey = msRootCert.GetECDsaPrivateKey() as ECDsaCng;
ECParameters msRootPrivateKeyParameters = msRootPrivateKey.ExportParameters(true);
// here comes the issue:
ECPrivateKeyParameters bcRootPrivateKeysParameters = TranslateMSKeysToBouncy(msRootPrivateKeyParameters);
// 2. generate "Client" key-pair:
AsymmetricCipherKeyPair bcClientKeyPair = bcKeyGen.GenerateKeyPair();
ECPrivateKeyParameters bcClientPrivKey = (ECPrivateKeyParameters)bcClientKeyPair.Private;
ECPrivateKeyParameters bcClientPublKey = (ECPublicKeyParameters)bcClientKeyPair.Public;
// 3. create X509 certificate:
X509V3CertificateGenerator bcCertGen = new X509V3CertificateGenerator();
bcCertGen.SetPublicKey(bcClientPublKey);
// .. set subject, validity period etc
ISignatureFactory sigFac = new Asn1SignatureFactory("Sha256WithECDSA", bcRootPrivateKeysParameters);
Org.BouncyCastle.X509.X509Certificate bcClientX509Cert = bcCertGen.Generate(sigFac);
byte[] x509CertEncoded = bcClientX509Cert.GetEncoded();
// остальное такое же, как в упомянутом примере.
Есть намеки?Или есть другой способ?(например: передача экземпляра X509Certificate2 непосредственно в библиотеку BouncyCastle (не переводить закрытые ключи в Cng) или создание сертификата «Клиент» без BouncyCastle) Спасибо.