2011-05-25 54 views
13

creo un certificado mediante BouncyCastleBouncyCastle PrivateKey Para X509Certificate2 PrivateKey

 var keypairgen = new RsaKeyPairGenerator(); 
     keypairgen.Init(new KeyGenerationParameters(new SecureRandom(new CryptoApiRandomGenerator()), 1024)); 

     var keypair = keypairgen.GenerateKeyPair(); 

     var gen = new X509V3CertificateGenerator(); 

     var CN = new X509Name("CN=" + certName); 
     var SN = BigInteger.ProbablePrime(120, new Random()); 

     gen.SetSerialNumber(SN); 
     gen.SetSubjectDN(CN); 
     gen.SetIssuerDN(CN); 
     gen.SetNotAfter(DateTime.Now.AddYears(1)); 
     gen.SetNotBefore(DateTime.Now.Subtract(new TimeSpan(7,0,0,0))); 
     gen.SetSignatureAlgorithm("MD5WithRSA"); 
     gen.SetPublicKey(keypair.Public); 

     gen.AddExtension( 
      X509Extensions.AuthorityKeyIdentifier.Id, 
      false, 
      new AuthorityKeyIdentifier( 
       SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(keypair.Public), 
       new GeneralNames(new GeneralName(CN)), 
       SN 
      )); 

     gen.AddExtension( 
      X509Extensions.ExtendedKeyUsage.Id, 
      false, 
      new ExtendedKeyUsage(new ArrayList() 
      { 
       new DerObjectIdentifier("1.3.6.1.5.5.7.3.1") 
      })); 

     var newCert = gen.Generate(keypair.Private); 

Este extremo con

X509Certificate2 certificate = new X509Certificate2(DotNetUtilities.ToX509Certificate((Org.BouncyCastle.X509.X509Certificate)newCert)); 

Ahora, debido a mi tarea me dice para almacenar tanto el certificado como el PrivateKey en el objeto X509Certificate2 Necesito una forma de convertir el par de llaves. Privado en un X509Certificate2.Private. ¿Algunas ideas?

Gracias.

+1

¿Qué tipo es el par de claves.privado? ¿Has mirado AsymmetricAlgorithm.Create()? –

+0

editar: Bueno, el .Create() funciona pero devuelve nulo cuando se usa en el par de claves.privado. Es del tipo AsymmetricKeyParameter – barjed

+0

hey. gracias por un código utilizable sobre cómo crear un X509Certificate2! ¡eso ayudó mucho! –

Respuesta

4

Si nos fijamos en los enlaces de this question, usted debe ser capaz de usar algo similar a DotNetUtilities.ToRSA(...) y poner su valor de retorno en el X509Certificate2 's PrivateKey.

6

Sólo sea lo más detallada, este es el código completo para agregar después de la creación del certificado X509Certificate2:

RSA rsaPriv = DotNetUtilities.ToRSA(keypair.Private as RsaPrivateCrtKeyParameters); 
certificate.PrivateKey = rsaPriv; 

(. Lo que por supuesto se puede optimizar en una sola línea)

3

Para cualquier persona que intenta exportar el X509Certificate2 a PKCS12 y conservar la clave privada. Esto es lo que tenía que hacer:

 // Convert BouncyCastle X509 Certificate to .NET's X509Certificate 
     var cert = DotNetUtilities.ToX509Certificate(certificate); 
     var certBytes = cert.Export(X509ContentType.Pkcs12, "password"); 

     // Convert X509Certificate to X509Certificate2 
     var cert2 = new X509Certificate2(certBytes, "password"); 

     // Convert BouncyCastle Private Key to RSA 
     var rsaPriv = DotNetUtilities.ToRSA(issuerKeyPair.Private as RsaPrivateCrtKeyParameters); 

     // Setup RSACryptoServiceProvider with "KeyContainerName" set 
     var csp = new CspParameters(); 
     csp.KeyContainerName = "KeyContainer"; 

     var rsaPrivate = new RSACryptoServiceProvider(csp); 

     // Import private key from BouncyCastle's rsa 
     rsaPrivate.ImportParameters(rsaPriv.ExportParameters(true)); 

     // Set private key on our X509Certificate2 
     cert2.PrivateKey = rsaPrivate; 

     // Export Certificate with private key 
     File.WriteAllBytes(@"C:\Temp\cert.pfx", cert2.Export(X509ContentType.Pkcs12, "password")); 
+0

Esta es la única forma que encontré para obtener realmente la clave privada adjunta al certificado en mi tienda de máquina y realmente poder recuperarla más tarde. –

+0

¡Saludos a ti! Gracias ! – SeyoS

0

Me gustaría compartir mi método:

pfj a System.Security.Cryptography.X509Certificates.X509Certificate2 usando castillo hinchable.

 public static X509Certificate2 OpenCertificate(string pfxPath, string contrasenia) 
    { 
     System.Security.Cryptography.X509Certificates.X509Certificate2 x509 = default(System.Security.Cryptography.X509Certificates.X509Certificate2); 

     MemoryStream ms = new MemoryStream(File.ReadAllBytes(pfxPath)); 

     Org.BouncyCastle.Pkcs.Pkcs12Store st = new Org.BouncyCastle.Pkcs.Pkcs12Store(ms, contrasenia.ToCharArray()); 

     var alias = st.Aliases.Cast<string>().FirstOrDefault(p => st.IsCertificateEntry(p)); 
     Org.BouncyCastle.Pkcs.X509CertificateEntry keyEntryX = st.GetCertificate(alias); 

     x509 = new System.Security.Cryptography.X509Certificates.X509Certificate2(DotNetUtilities.ToX509Certificate(keyEntryX.Certificate)); 

     alias = st.Aliases.Cast<string>().FirstOrDefault(p => st.IsKeyEntry(p)); 
     Org.BouncyCastle.Pkcs.AsymmetricKeyEntry keyEntry = st.GetKey(alias); 
     System.Security.Cryptography.RSACryptoServiceProvider intermediateProvider = (System.Security.Cryptography.RSACryptoServiceProvider)Org.BouncyCastle.Security.DotNetUtilities.ToRSA((Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters)keyEntry.Key); 

     x509.PrivateKey = intermediateProvider; 

     return x509; 
    } 
Cuestiones relacionadas