Создание сертификата X509Certificate2 из RSACryptoServiceProvider завершается с ошибкой: не удается найти запрошенный объект

Образец кода:

        CspParameters cspParameters = new CspParameters();
        cspParameters.ProviderType = 1; // PROV_RSA_FULL

        // Create the crypto service provider, generating a new
        // key.
        mRsaCSP = new RSACryptoServiceProvider(mDefaultKeyLength, cspParameters);
        mRsaCSP.PersistKeyInCsp = true;
        RSAParameters privateKey = mRsaCSP.ExportParameters(true);


        byte[] rsaBytes = mRsaCSP.ExportCspBlob(true);

        try
        {
            X509Certificate2 cert = new X509Certificate2(rsaBytes);                
            mKeyDataPfx = Convert.ToBase64String(cert.Export(X509ContentType.Pkcs12, password));
        }
        catch (Exception ce)
        {
            string error = ce.Message;
        }

person arunpereira    schedule 04.02.2012    source источник
comment
Ключ RSA несовместим напрямую с сертификатом X509. Сертификат X509 должен иметь ключ, подписанный эмитентом, даже если он является самоподписанным. Можете ли вы рассказать нам, чего вы на самом деле пытаетесь достичь? Вы пытаетесь динамически создать сертификат X509 в коде?   -  person Phil Bolduc    schedule 04.02.2012
comment
Да. Это именно то, что я пытаюсь сделать. Идея состоит в том, что у меня есть старые сертификаты RSA, хранящиеся в виде строки с RSACryptoServiceProvider.ToXmlString(true). Их нужно будет прочитать и экспортировать в виде файлов PFX. Новые сертификаты RSA должны быть сгенерированы и сохранены в виде файлов PFX.   -  person arunpereira    schedule 04.02.2012
comment
Я предлагаю вам ознакомиться с исходным кодом и примерами Bouncy Castle .NET. Я думаю, что пример bccrypto-net-1.7-src\csharp\crypto\test\src\pkcs\examples\PKCS12Example.cs должен помочь вам начать работу. bouncycastle.org/csharp   -  person Phil Bolduc    schedule 05.02.2012


Ответы (1)


Вот мое решение с использованием библиотеки BouncyCastle.

// create the RSA key from an XML string
RSACryptoServiceProvider key = new RSACryptoServiceProvider();
key.FromXmlString(keyTextBox.Text);

// convert to BouncyCastle key object
var keypair = DotNetUtilities.GetRsaKeyPair(key);

var gen = new X509V3CertificateGenerator();

string certName = Path.GetFileNameWithoutExtension(fileName);
var name = new X509Name("CN=" + certName);
var serial = BigInteger.ProbablePrime(120, new Random());

gen.SetSerialNumber(serial);
gen.SetSubjectDN(name);
gen.SetIssuerDN(name);
gen.SetNotAfter(DateTime.Now.AddYears(10));
gen.SetNotBefore(DateTime.Now);
gen.SetSignatureAlgorithm("MD5WithRSA");
gen.SetPublicKey(keypair.Public);

// generate the certificate
var newCert = gen.Generate(keypair.Private);
// convert back to .NET certificate
var cert = DotNetUtilities.ToX509Certificate(newCert);
// export as byte array
byte[] certData = cert.Export(X509ContentType.Pfx);

File.WriteAllBytes(fileName, certData);
person Jon Grant    schedule 28.09.2015