2010-02-23 3 views
17

Я отправляю его в Интернете, нахожу много образцов для создания нового x509Certificate2 из файла в .net, но нет ни одного примера, чтобы показать, как сгенерировать полностью новый x509Certificate2 с самого начала в .net.Как создать совершенно новый x509Certificate2 в .net?

Есть ли кто-нибудь, кто может сказать мне, как это сделать в .net?

спасибо.

+0

не кажется, никто это знают. Кажется, что x509Certificate2 in .net предназначен только для чтения сертификатов x509Certificate2 вместо их генерирования, ? – travellover

+1

Да, с помощью метода и конструктора, который имеет X509Certificate2, мы можем импортировать и получать его свойства. – pinichi

ответ

0

Я думаю, вы не можете сделать это, используя этот API. Но вы можете создать его с помощью Bouncy Castle (http://www.bouncycastle.org), а затем преобразовать этот объект в объект X509Certificate2 (для этого BC имеет некоторый класс утилиты).

-edit- Взгляните на эти BC классов: X509V3CertificateGenerator и X509Certificate

Служебный класс BC, который позже будет преобразовать объект BC X509Certificate в обычный объект X509Certificate2 является: DotNetUtilities

3

Вы можете использовать PINVOKE для вызова в Crypt32 до create a self signed certificate. Существует около sample code, которые будут генерировать один и помещать его в хранилище сертификатов для вас.

Существует также Keith Brown's certificate generator, который написан в управляемом коде и имеет a library you can use.

В качестве альтернативы вы можете использовать BouncyCastle с помощью Org.BouncyCastle.X509.X509V3CertificateGenerator и использовать утилиты в Org.BouncyCastle.Security.DotNetUtilities и позвонить по номеру ToX509Certificate().

Если вы хотите создать запрос и подписали его CA, что на самом деле проще в .NET, так как большинство этих классов могут быть импортированы как DLL-файлы COM-взаимодействия. Но это еще один вопрос.

+0

На самом деле код Кейта Брауна просто использует P/Invoke для Crypt32-методов. –

+0

Ну, это красиво обертывает его, чтобы у вас тоже не было. Потому что Crypt-32 не дружит с pinvoke :) – blowdart

+0

Ссылка на материал Кейта Брауна мертва. Кто-нибудь получил текущую ссылку? –

14

Вот код, который вы можете использовать:

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

для этой работы, не забудьте добавить ссылку на BouncyCastle library

+0

работал для меня, а BouncyCastle включен NuGet – jhilden

+0

Я мог ошибаться в этом, но не должен ли новый Random() быть статическим экземпляром Randomon Randomon? Он будет возвращать одинаковое случайное число в ProbablePrime каждый раз, каждый раз, когда вы создаете новый экземпляр. –

+0

Я побежал BouncyCastle (1.7.1) через VeraCode, и я обнаружил, что реализация BigInteger не обеспечивает достаточной энтропии. Это ставит под сомнение обоснованность генерации простых чисел, которые использует библиотека. –

Смежные вопросы