2013-08-27 14 views
11

Pracuję nad kodem, który tworzy certyfikat X509 i parę kluczy publiczny/prywatny. Klucz publiczny zostanie dodany do certyfikatu i zostanie wysłany do urzędu certyfikacji, który go podpisuje.Powiąż klucz prywatny z klasą X509Certificate2 w .net

Zwrócony certyfikat jest następnie dostępny za pośrednictwem klasy System.Security.Cryptography.X509Certificates.X509Certificate2. Teraz chcę użyć tego certyfikatu do zainicjowania bezpiecznego połączenia z innymi klientami. Dlatego używam klasy SslStream. Aby rozpocząć uzgadnianie SSL, używam tej metody:

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

Ta metoda wymaga skojarzenia klucza prywatnego z certyfikatem. Oczywiście certyfikat zwracany przez urząd certyfikacji nie zawiera klucza prywatnego. Ale jest przechowywany jako plik .key na dysku twardym. Klasa X509Certificate2 ma właściwość o nazwie PrivateKey, która prawdopodobnie skojarzy klucz prywatny z certyfikatem, ale nie mogę znaleźć sposobu na ustawienie tej właściwości.

Czy istnieje sposób, w jaki mogę powiązać klucz prywatny z klasą .net X509?

Odpowiedz

13

Dla wszystkich innych z tego samego problemu, znalazłem schludny mały kawałek kodu, który pozwala ci robić dokładnie to:

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

to lepszy sposób niż do zwijaj klucz prywatny i certyfikat razem użyłem tej opcji i znaleźć wspaniałą alternatywą . – Alejandro

+0

Gdybyś był tak miły, aby nas oświecić o naturze tej wyższości? – sschober

+1

do uwzględnienia kodu dla metod pomocnika, denerwujące, aby utworzyć użytkownika w zewnętrznej witrynie, aby uzyskać dostęp. –

18

można zaoszczędzić sobie kłopotów z kopiowaniem wklejanie wszystko że kod i przechowywać klucz prywatny obok certyfikatu w pfx/pkcs#12 pliku:

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

będziesz hAV e dostarczyć hasło, które trzeba przekazać do konstruktora X509Certificate2:

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

to mnie uratowało! utworzyłem pfx, ale nie zdałem sobie sprawy, że muszę również podać to hasło do konstruktora. –

+0

Znakomita odpowiedź! Użyłem tego, aby uniknąć kłopotów z rejestracją certyfikatu za pomocą wtyczki MMC. – Sean

Powiązane problemy