2010-02-23 14 views
17

Ich google es aus dem Web, finde viele Beispiele, um ein neues x509Certificate2 aus einer Datei in .net zu generieren, aber es gibt kein Beispiel, um zu zeigen, wie man ein komplett neues x509Certificate2 von Anfang an in .net erzeugt.Wie erstellt man ein komplett neues x509Certificate2 in .net?

Gibt es jemanden, der mir sagen kann, wie man es in .net macht?

Vielen Dank.

+0

hinzuzufügen scheint dies niemand wissen. Scheint, dass x509Certificate2 in .net nur zum Lesen von x509Certificate2-Zertifikaten dient, anstatt solche zu generieren, oder? – travellover

+1

Ja, mit Methode und Konstruktor, die X509Certificate2 haben, können wir nur importieren und seine Eigenschaften erhalten. – pinichi

Antwort

0

Ich denke, Sie können es nicht mit dieser API tun. Aber Sie können einen mit Bouncy Castle (http://www.bouncycastle.org) erstellen und später dieses Objekt in ein X509Certificate2-Objekt konvertieren (BC hat dafür eine Utility-Klasse).

-edit- Werfen Sie einen Blick auf diese BC Klassen: X509V3CertificateGenerator und X509Certificate

Die Utility-Klasse BC, die konvertiert später ein BC X509Certificate Objekt zu einem regulären X509Certificate2 Objekt ist: DotNetUtilities

3

Sie verwenden können PINVOKE, um in Crypt32 zu create a self signed certificate anzurufen. Es gibt einige sample code zur Verfügung, die eine erzeugen und in den Zertifikatsspeicher für Sie legen.

Es gibt auch Keith Browns certificate generator, die in verwaltetem Code geschrieben ist und a library you can use hat.

Alternativ können Sie auch BouncyCastle mit dem Org.BouncyCastle.X509.X509V3CertificateGenerator verwenden und die Hilfsmethoden in Org.BouncyCastle.Security.DotNetUtilities verwenden und ToX509Certificate() anrufen.

Wenn Sie eine Anforderung erstellen und von einer CA signieren lassen möchten, ist das in .NET einfacher, da die meisten dieser Klassen als COM-Interop-DLLs importiert werden können. Aber das ist eine ganz andere Frage.

+0

Tatsächlich verwendet Keith Browns Code auch P/Invoke zu den Crypt32-Methoden. –

+0

Nun, es ist schön verpackt, so dass Sie nicht haben. Weil Crypt-32 nicht pinvoke freundlich ist :) – blowdart

+0

Der Link zu Keith Browns Zeug ist tot. Jeder hat einen aktuellen Link? –

14

Hier ist ein Code, den Sie verwenden können:

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)); 
    } 

für diese zu arbeiten, vergessen Sie nicht Bezug auf BouncyCastle library

+0

arbeitete für mich, und BouncyCastle ist eingeschaltet NuGet – jhilden

+0

Ich könnte falsch sein, aber sollte das neue Random() nicht eine statische Readonly Random-Instanz sein? Es wird jedes Mal die gleiche Zufallszahl in ProbablePrime zurückgegeben, wenn Sie jedes Mal eine neue Instanz erstellen. –

+0

Ich habe BouncyCastle (1.7.1) über VeraCode ausgeführt und ich fand, dass es die Implementierung von BigInteger nicht genug Entropie bietet. Dies stellt die Gültigkeit der von der Bibliothek verwendeten Primzahlgenerierung in Frage. –

Verwandte Themen