2011-10-10 12 views
7

Używamy kodu C#, tworzymy X509Certificate2 z plikiem .p12, w konstruktorze wstawiamy ścieżkę do certyfikatu, hasło certyfikatu. Mamy również oznaczone jako eksportowane, jak pokazano poniżej:Eksportuj klucz prywatny z obiektu X509Certyfikat

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

otrzymamy klucz prywatny jako format AsymmetricAlgorithm brzmienie:

x509Certificate2.PrivateKey 

Teraz chcemy uzyskać klucz prywatny z certyfikatem jako Format Base64 - ale nie mamy pojęcia, jak to zrobić, a jest to dla nas tak ważne.

+0

Z czego próbujesz korzystać z wyjścia Base64? Czy jest to surowa potrzeba czy preferencja? –

Odpowiedz

2

Możesz po prostu użyć właściwości PrivateKey certyfikatu X509Certificate2. Faktyczna realizacja powrócił klucza prywatnego zależy od algorytmu wykorzystywanego w świadectwie - zwykle jest to RSA:

rsaObj = (RSACryptoServiceProvider)myCertificate.PrivateKey; 

Następnie powinieneś być w stanie uzyskać informacje o kluczu RSA z jest to nieruchomość ExportParameters.

+0

i kiedy znamy kluczowe informacje (na przykład RSA-PKCS1-KeyEx), w jaki sposób możemy przekonwertować klucz prywatny na base64? – RRR

-3

Jeśli jedynym problemem jest to, aby uzyskać klucz prywatny Base64 zakodowane, można po prostu zrobić tak:

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

privateKey.ToString() zwraca "System.Security.Cryptography.RSACryptoserviceProvider" ....., to nie jest prywatny klucz ... – RRR

+0

@RRR jest poprawny. Przekonasz się, że x509Certificate2.PublicKey.Key.ToString() zwróci wartość * taką samą *, wykonując to w ten sposób. To nie może być słuszne :) – rdev5

3

Ważnym pytaniem jest, dlaczego base64?

Jeśli jest to dla twojej własnej aplikacji, możesz zachować klucz prywatny jako łańcuch XML (o wiele łatwiej :-).

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

Jeśli chcesz base64 (znowu tylko dla aplikacji) można wyeksportować klucz (RSAParameters) następnie concat każdego byte[] i włącz wyjście połączone w ciąg base64.

Ale jeśli chcesz współdziałanie z innymi aplikacjami, który wymaga base64 klucz prywatny, to trzeba wiedzieć, format (wewnątrz base64 ciąg). Na przykład. w wielu przypadkach klucze prywatne są kodowane PEM (czyli base64 ze specjalnym nagłówkiem/stopką, patrz example dla X509Certificate).

Jeśli tego szukasz, musisz najpierw zakodować klucz prywatny w strukturze PKCS#8, a następnie umieścić w base64 i dodać nagłówek/stopkę. Możesz znaleźć przydatny kod, aby to zrobić: inside Mono.Security.dll (MIT.X11 kod licencjonowany z projektu Mono).

+0

I depented na innej aplikacji, która wymaga, aby uzyskać klucz prywatny base64. Chcę zezwolić użytkownikowi na wstawienie X509Certificate2 i samodzielnie wyodrębnić klucz prywatny jako format podstawowy 64 - czy wiesz, czy struktura .Net ujawnia jakikolwiek sposób to zrobić? – RRR

+0

NIE, jeśli tak (naprawdę w to wątpię) lub gdybym wiedział, że uwzględniłbym to w mojej odpowiedzi.W związku z tym twój problem pozostaje, nie jest to problem ** base64 **, ale jest to ** wewnątrz **, które jest ważne, aby współdziałać z twoją drugą aplikacją. – poupou

Powiązane problemy