2010-02-23 11 views
17

Lo busco desde la web, encuentro muchas muestras para generar un nuevo x509Certificate2 desde un archivo en .net, pero no hay una muestra para mostrar cómo generar un x509Certificate2 completamente nuevo desde el principio en .net.cómo crear un x509Certificate2 completamente nuevo en .net?

¿Hay alguien que pueda decirme cómo hacerlo en .net?

Muchas gracias.

+0

parece saber esto a nadie. Parece que x509Certificate2 en .net solo sirve para leer certificados x509Certificate2 en lugar de generarlos, ¿no? – travellover

+1

Sí, con el método y el constructor que tiene X509Certificate2, solo podemos importar y obtener sus propiedades. – pinichi

Respuesta

0

Creo que no puedes hacerlo con esa API. Pero puede crear uno usando Bouncy Castle (http://www.bouncycastle.org) y luego convertir ese objeto a un objeto X509Certificate2 (BC tiene alguna clase de utilidad para hacer eso).

operación -Editar- Echa un vistazo a estas clases BC: X509V3CertificateGenerator y X509Certificate

La clase de utilidad antes de Cristo que posteriormente convertir un objeto antes de Cristo X509Certificate al objeto regular X509Certificate2 es: DotNetUtilities

3

Se puede utilizar PINVOKE para llamar a Crypt32 al create a self signed certificate. Hay algunos sample code disponibles que generarán uno y lo colocarán en la tienda de certificados por usted.

También está Keith Brown's certificate generator, que está escrito en código administrado y tiene a library you can use.

También puede utilizar BouncyCastle usando el Org.BouncyCastle.X509.X509V3CertificateGenerator y utilizar los métodos de utilidad en Org.BouncyCastle.Security.DotNetUtilities y llamar al ToX509Certificate().

Si desea crear una solicitud y tenerla firmada por una CA que sea realmente más fácil en .NET, ya que la mayoría de esas clases se pueden importar como DLL de interoperabilidad COM. Pero esa es otra pregunta.

+0

En realidad, el código de Keith Brown solo usa P/Invoke para los métodos de Crypt32. –

+0

Bueno, lo envuelve muy bien para que no tengas demasiado. Debido a que Crypt-32 no es fácil de usar :) – blowdart

+0

El vínculo con las cosas de Keith Brown está muerto. ¿Alguien tiene un enlace actual? –

14

Aquí hay un código que puede utilizar:

static X509Certificate2 GenerateCertificate(string certName) 
    { 
     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.MaxValue); 
     gen.SetNotBefore(DateTime.Now.Subtract(new TimeSpan(7, 0, 0, 0))); 
     gen.SetSignatureAlgorithm("MD5WithRSA"); 
     gen.SetPublicKey(keypair.Public);   

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

     return new X509Certificate2(DotNetUtilities.ToX509Certificate((Org.BouncyCastle.X509.X509Certificate)newCert)); 
    } 

para que esto funcione, no se olvide de añadir una referencia a BouncyCastle library

+0

funcionó para mí, y BouncyCastle está activado NuGet – jhilden

+0

Podría estar equivocado al respecto, pero ¿no debería el nuevo Random() ser una instancia Aleatoria estática de solo lectura? Devolverá el mismo número aleatorio en ProbablePrime cada vez si crea una nueva instancia cada vez. –

+0

He ejecutado BouncyCastle (1.7.1) a través de VeraCode y he descubierto que su implementación de BigInteger no proporciona suficiente entropía. Esto cuestiona la validez de la generación de números primos que usa la biblioteca. –

Cuestiones relacionadas