Экспорт закрытого ключа из объекта X509Certificate - PullRequest
8 голосов
/ 10 октября 2011

Мы используем код C #, мы создаем X509Certificate2 с файлом .p12, в конструктор мы вставляем путь к сертификату, пароль сертификата.Мы также пометили его как Exportable, как показано ниже:

X509Certificate2 x509Certificate2 = new X509Certificate2
("...\\MyCerificate.p12", "P@ssw0rd", X509KeyStorageFlags.Exportable);

мы получаем закрытый ключ в формате AsymmetricAlgorithm следующим образом:

x509Certificate2.PrivateKey

Теперь мы хотим получить закрытый ключ отсертификат в формате Base64 - но мы понятия не имеем, как это сделать, и это так важно для нас.

Ответы [ 4 ]

4 голосов
/ 10 октября 2011

Важный вопрос: почему base64 ?

Если это для вашего собственного приложения, то вы можете сохранить закрытый ключ в виде строки XML (намного проще: -).

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

Если вы хотите base64 (опять же только для вашего приложения) вы можете экспортировать ключ (RSAParameters), затем выполнять конкататацию каждые byte[] и преобразовывать объединенный вывод в строку base64.

Но если вы хотите взаимодействовать с другими приложениями, требующими base64 закрытый ключ, тогда вам нужно знать формат (внутри строки base64 ).Например, во многих случаях закрытые ключи кодируются PEM (это base64 со специальным верхним / нижним колонтитулом, см. пример для X509Certificate).

Если это то, чтозатем вы должны сначала закодировать закрытый ключ в структуре PKCS # 8 , затем включить base64 и добавить верхний / нижний колонтитулы.Вы можете найти полезный код для этого внутри Mono.Security.dll (лицензионный код MIT.X11 из проекта Mono).

2 голосов
/ 10 октября 2011

Вы можете просто использовать свойство PrivateKey X509Certificate2.Реальная возвращенная реализация закрытого ключа зависит от алгоритма, используемого в сертификате - обычно это RSA:

rsaObj = (RSACryptoServiceProvider)myCertificate.PrivateKey; 

После этого вы сможете получить информацию о ключе RSA из его свойства ExportParameters.

0 голосов
/ 13 марта 2019

Вы можете сделать это с помощью библиотеки OpenSSL для .NET:

using DidiSoft.OpenSsl;
...
X509Certificate2 x509Certificate2 = new X509Certificate2
("...\\MyCerificate.p12", "P@ssw0rd", X509KeyStorageFlags.Exportable);

PrivateKey privKey = PrivateKey.Load(x509Certificate2.PrivateKey);
bool withNewLines = true;
string base64PrivateKey = privKey.ToBase64String(withNewLines);
0 голосов
/ 10 октября 2011

Если ваша единственная проблема - получить закрытый ключ в кодировке Base64, вы можете просто сделать так:

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