2012-02-04 41 views
8
código

Muestra solicitada:Crear un X509Certificate2 de RSACryptoServiceProvider falla con No se puede encontrar el objeto

 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 clave RSA no es directamente compatible con un certificado X509. Un certificado X509 debe tener la clave firmada por un emisor, incluso si está autofirmado. ¿Puedes decirnos qué estás realmente tratando de lograr? ¿Estás tratando de crear dinámicamente un certificado X509 en código? –

+1

Sí. Eso es exactamente lo que estoy tratando de hacer. La idea es que tengo viejos certificados RSA almacenados como una cadena con RSACryptoServiceProvider.ToXmlString (verdadero). Esos necesitarían ser leídos y exportados como archivos PFX. Los nuevos certificados RSA tendrían que generarse y almacenarse como archivos PFX. – chiefbrownbotom

+0

Le sugiero que consulte el código fuente de Bouncy Castle .NET y ejemplos. Creo que el ejemplo bccrypto-net-1.7-src \ csharp \ crypto \ test \ src \ pkcs \ examples \ PKCS12Example.cs debería ayudarlo a comenzar. http://www.bouncycastle.org/csharp/ –

Respuesta

2

Aquí está mi solución, utilizando la biblioteca 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); 
Cuestiones relacionadas