2013-08-27 54 views
11

Tôi đang làm việc trên một số mã tạo chứng chỉ X509certificate và cặp khóa công khai/riêng tư. Khóa công khai được thêm vào chứng chỉ và nó được gửi đến một CA có ký tên.Kết hợp khóa riêng với lớp X509Certificate2 trong .net

Chứng chỉ được trả về sau đó được truy cập thông qua lớp System.Security.Cryptography.X509Certificates.X509Certificate2. Bây giờ tôi muốn sử dụng chứng chỉ này để bắt đầu kết nối an toàn với các máy khách khác. Vì vậy, tôi sử dụng lớp SslStream. Để bắt đầu Bắt tay SSL, tôi sử dụng phương pháp này:

server.AssociatedSslStream.AuthenticateAsServer(
         MyCertificate,      // Client Certificate 
         true,        // Require Certificate from connecting Peer 
         SslProtocols.Tls,     // Use TLS 1.0 
         false        // check Certificate revocation 
        ); 

Phương pháp này yêu cầu khóa cá nhân được liên kết với chứng chỉ. Tất nhiên chứng chỉ được trả về bởi CA không chứa khóa riêng. Nhưng nó được lưu trữ dưới dạng tệp .key trên đĩa cứng. Lớp X509Certificate2 có một thuộc tính được gọi là PrivateKey mà tôi đoán sẽ kết hợp một khóa riêng với chứng chỉ, nhưng tôi không thể tìm thấy một cách để thiết lập thuộc tính này.

Có cách nào để tôi có thể kết hợp khóa cá nhân với lớp .net X509 không?

Trả lời

13

Đối với mọi người khác với cùng một vấn đề, tôi thấy một chút mảnh gọn gàng mã mà cho phép của bạn thực hiện chính xác rằng:

http://www.codeproject.com/Articles/162194/Certificates-to-DB-and-Back

byte[] certBuffer = Helpers.GetBytesFromPEM(publicCert, PemStringType.Certificate); 
byte[] keyBuffer = Helpers.GetBytesFromPEM(privateKey, PemStringType.RsaPrivateKey); 

X509Certificate2 certificate = new X509Certificate2(certBuffer, password); 

RSACryptoServiceProvider prov = Crypto.DecodeRsaPrivateKey(keyBuffer); 
certificate.PrivateKey = prov; 
+1

Đây là một cách tốt hơn để gói chìa khóa cá nhân và chứng với nhau, tôi đã sử dụng tùy chọn này và thấy nó là một thay thế vượt trội . – Alejandro

+0

Nếu bạn rất tử tế để khai sáng cho chúng tôi về bản chất của ưu thế này? – sschober

+1

không bao gồm mã cho các phương thức trợ giúp, gây phiền nhiễu khi phải tạo người dùng trên trang web bên ngoài để có quyền truy cập. –

18

Bạn có thể tiết kiệm cho mình những rắc rối của sao chép dán tất cả mã và lưu trữ các khóa riêng bên cạnh các chứng chỉ trong một tập tin pfx/pkcs#12:

openssl pkcs12 -export -in my.cer -inkey my.key -out mycert.pfx 

Bạn sẽ hav e để cung cấp một mật khẩu, mà bạn phải vượt qua để các nhà xây dựng của X509Certificate2:

X509Certificate2 cert = new X509Certificate2("mycert.pfx","password"); 
+0

điều này đã lưu tôi! tạo ra pfx, nhưng didnt nhận ra tôi cũng cần thiết để cung cấp mật khẩu đó cho constructor. –

+0

Câu trả lời nổi bật! Tôi đã sử dụng điều này để tránh rắc rối khi đăng ký chứng chỉ qua plugin MMC. – Sean