2011-10-10 30 views
7

Chúng tôi sử dụng mã C# chúng tôi xây dựng X509Certificate2 với tệp .p12, trong hàm tạo, chúng tôi chèn đường dẫn đến chứng chỉ, mật khẩu của chứng chỉ. Chúng tôi cũng đánh dấu nó như thể xuất khẩu như hình dưới đây:Xuất khóa riêng tư từ X509Đối tượng chứng nhận

X509Certificate2 x509Certificate2 = new X509Certificate2 
("...\\MyCerificate.p12", "[email protected]", X509KeyStorageFlags.Exportable); 

chúng tôi nhận được khóa bí mật như là định dạng AsymmetricAlgorithm bởi những điều sau:

x509Certificate2.PrivateKey 

Bây giờ, chúng tôi muốn để có được khóa bí mật từ các chứng chỉ như Định dạng Base64 - nhưng chúng tôi không có bất kỳ ý tưởng làm thế nào để làm điều đó, và nó rất quan trọng đối với chúng tôi.

+0

Bạn đang cố gắng sử dụng đầu ra Base64 với? Đó có phải là một nhu cầu nghiêm ngặt hoặc một sở thích? –

Trả lời

2

Bạn chỉ có thể sử dụng thuộc tính PrivateKey của X509Certificate2. Các thực tế trở lại thực hiện khóa riêng phụ thuộc vào các thuật toán được sử dụng trong giấy chứng nhận - thường đây là RSA:

rsaObj = (RSACryptoServiceProvider)myCertificate.PrivateKey; 

Sau đó bạn sẽ có thể để có được những thông tin quan trọng RSA từ đó là tài sản ExportParameters.

+0

và khi chúng tôi biết thông tin quan trọng (ví dụ: RSA-PKCS1-KeyEx), làm cách nào chúng tôi có thể chuyển khóa cá nhân thành base64? – RRR

-3

Nếu vấn đề duy nhất của bạn là để có được các Base64 khóa bí mật được mã hóa, bạn chỉ có thể làm như thế này:

var privateKey = x509Certificate2.PrivateKey; 
var encoding = new System.Text.ASCIIEncoding(); 
var base64String = Convert.ToBase64String(encoding.GetBytes(privateKey.ToString())); 
+2

privateKey.ToString() trả về "System.Security.Cryptography.RSACryptoserviceProvider" ....., đây không phải là khóa riêng ... – RRR

+0

@RRR là chính xác. Bạn sẽ thấy rằng x509Certificate2.PublicKey.Key.ToString() sẽ trả về giá trị * cùng * làm theo cách này. Điều đó không thể đúng :) – rdev5

3

Câu hỏi quan trọng là tại sao base64?

Nếu điều này là dành cho ứng dụng của riêng bạn thì bạn có thể giữ khóa riêng tư dưới dạng chuỗi XML (dễ dàng hơn nhiều :-).

string xml = x509Certificate2.PrivateKey.ToXmlString (true); 

Nếu bạn muốn base64 (một lần nữa chỉ dành riêng cho ứng dụng của bạn), bạn có thể export khóa (RSAParameters) sau đó concat mỗi byte[] và biến đầu ra sáp nhập vào một chuỗi base64.

Nhưng nếu bạn muốn interop với các ứng dụng khác mà đòi hỏi một base64 private key thì bạn cần phải biết định dạng (bên trong base64 string). Ví dụ. trong nhiều trường hợp, khóa riêng được mã hóa PEM (là base64 có đầu trang/chân trang đặc biệt, xem example cho X509Certificate).

Nếu bạn đang tìm kiếm gì thì bạn cần phải mã hóa khóa riêng trong cấu trúc PKCS#8 trước, sau đó chuyển thành base64 và thêm đầu trang/chân trang. Bạn có thể tìm thấy một số mã hữu ích để làm như vậy inside Mono.Security.dll (MIT.X11 mã được cấp phép từ dự án Mono).

+0

Tôi đã đăng ký trên ứng dụng khác yêu cầu phải có khóa riêng tư base64. Tôi muốn cho phép người dùng chèn X509Certificate2 và tự mình trích xuất khóa riêng dưới dạng định dạng cơ bản 64 - bạn có biết nếu .Net framework phơi bày bất kỳ cách nào để làm điều đó? – RRR

+0

KHÔNG, nếu có (tôi thực sự nghi ngờ điều đó) hoặc nếu tôi biết tôi sẽ đưa nó vào câu trả lời của tôi.Điều đó đang được nói rằng vấn đề của bạn vẫn còn, nó không phải là một vấn đề ** base64 **, nó biết đó là ** bên trong ** điều quan trọng là interop với ứng dụng khác của bạn. – poupou

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