2012-02-04 11 views
8
codice

Campione richiesto:Creare un X509Certificate2 da RSACryptoServiceProvider fallisce con Non riesci a trovare l'oggetto

 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; 
     } 
+0

Una chiave RSA non è direttamente compatibile con un certificato X509. Un certificato X509 deve avere la chiave firmata da un emittente, anche se è autofirmata. Puoi dirci cosa stai effettivamente cercando di realizzare? Stai cercando di creare dinamicamente un certificato X509 nel codice? –

+1

Sì. Questo è esattamente quello che sto cercando di fare. L'idea è che ho i vecchi certificati RSA memorizzati come stringa con RSACryptoServiceProvider.ToXmlString (true). Questi dovrebbero essere letti ed esportati come file PFX. I nuovi certificati RSA dovrebbero essere generati e archiviati come file PFX. – chiefbrownbotom

+0

Ti suggerisco di consultare il codice sorgente di Bouncy Castle .NET ed esempi. Penso che l'esempio bccrypto-net-1.7-src \ csharp \ crypto \ test \ src \ pkcs \ examples \ PKCS12Example.cs dovrebbe iniziare. http://www.bouncycastle.org/csharp/ –

risposta

2

Ecco la mia soluzione, utilizzando la libreria 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);