2010-02-23 35 views
17

Tôi google nó từ web, tìm nhiều mẫu để tạo ra một x509Certificate2 mới từ một tệp trong .net, nhưng không có mẫu nào để hiển thị cách tạo một x509Certificate2 hoàn toàn mới từ đầu trong .net.cách tạo x509Certificate2 hoàn toàn mới bằng .net?

Có cách nào có thể cho tôi biết cách thực hiện trong .net?

Cảm ơn bạn rất nhiều.

+0

dường như không ai biết điều này. Có vẻ như x509Certificate2 trong .net chỉ để đọc chứng chỉ x509Certificate2 thay vì tạo các chứng chỉ, đúng không? – travellover

+1

Có, Với phương thức và hàm tạo mà X509Certificate2 có, chúng ta chỉ có thể nhập và nhận các thuộc tính của nó. – pinichi

Trả lời

0

Tôi nghĩ bạn không thể làm điều đó bằng API đó. Nhưng bạn có thể tạo một bằng cách sử dụng Bouncy Castle (http://www.bouncycastle.org) và sau đó chuyển đổi đối tượng đó thành đối tượng X509Certificate2 (BC có một số lớp tiện ích để thực hiện điều đó).

-edit- Hãy nhìn vào những lớp BC: X509V3CertificateGenerator và X509Certificate

BC lớp tiện ích mà sau này sẽ chuyển đổi một đối tượng BC X509Certificate đến một đối tượng X509Certificate2 thường xuyên là: DotNetUtilities

3

Bạn có thể sử dụng PINVOKE để gọi vào Crypt32 đến create a self signed certificate. Có sẵn một số sample code để tạo và đặt nó trong kho chứng chỉ cho bạn.

Ngoài ra còn có certificate generator của Keith Brown, được viết bằng mã được quản lý và có a library you can use.

Hoặc bạn chỉ có thể sử dụng BouncyCastle bằng cách sử dụng Org.BouncyCastle.X509.X509V3CertificateGenerator và sử dụng các phương pháp tiện ích trong Org.BouncyCastle.Security.DotNetUtilities và gọi ToX509Certificate().

Nếu bạn muốn tạo yêu cầu và yêu cầu nó có chữ ký của CA thực sự dễ dàng hơn trong .NET, vì hầu hết các lớp đó có thể được nhập dưới dạng tệp COM interop DLL. Nhưng đó là một câu hỏi hoàn toàn khác.

+0

Thực ra mã của Keith Brown chỉ sử dụng P/Invoke cho các phương thức Crypt32. –

+0

Vâng, nó độc đáo kết thúc tốt đẹp nó để bạn không có quá. Bởi vì Crypt-32 không phải là pinvoke thân thiện :) – blowdart

+0

Các liên kết đến công cụ của Keith Brown đã chết. Có ai có liên kết hiện tại không? –

14

Dưới đây là một mã bạn có thể sử dụng:

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

để làm việc này, đừng quên để thêm tài liệu tham khảo để BouncyCastle library

+0

làm việc cho tôi và BouncyCastle đang bật NuGet – jhilden

+0

Tôi có thể sai về điều này, nhưng không nên ngẫu nhiên mới() là một trường hợp ngẫu nhiên chỉ đọc tĩnh? Nó sẽ trả về cùng một số ngẫu nhiên trong ProbablePrime mỗi lần nếu bạn tạo một cá thể mới mỗi lần. –

+0

Tôi đã chạy BouncyCastle (1.7.1) thông qua VeraCode và tôi thấy rằng nó thực hiện BigInteger không cung cấp đủ entropy. Điều này đặt ra câu hỏi về tính hợp lệ của việc tạo số nguyên tố mà thư viện sử dụng. –

Các vấn đề liên quan