Экспорт сертификата в формате .cer с кодировкой BASE-64

Я пытаюсь экспортировать сертификат без закрытого ключа, как файл в кодировке BASE-64, так же, как его экспорт из Windows. При экспорте из Windows я могу открыть файл .cer в блокноте.

Когда я пробую следующее и открываю в блокноте, я получаю двоичные данные ... Я думаю, что они ... не читаются.

X509Certificate2 cert = new X509Certificate2("c:\\myCert.pfx", "test", X509KeyStorageFlags.Exportable);

File.WriteAllBytes("c:\\testcer.cer", cert.Export(X509ContentType.Cert));

Я попытался удалить «X509KeyStorageFlags.Exportable», но это не сработало. Я что-то упустил?

Изменить - я пробовал

File.WriteAllText("c:\\testcer.cer",Convert.ToBase64String(cert.Export(X509ContentType.Cert)))

и это, похоже, работает, однако без «----- НАЧАЛО СЕРТИФИКАТА -----» и «----- КОНЕЦ СЕРТИФИКАТА -----»


person Saif Khan    schedule 19.01.2011    source источник
comment
Из-за устаревшей монофреймворка, который я вынужден использовать, я прибег к вызову openssl как внешнего процесса: openssl pkcs12 -in importPath -nokeys -passin pass: - это работает как с двоичными файлами openssl для Linux, так и для Windows.   -  person Rbjz    schedule 22.07.2016


Ответы (4)


Возможно

/// <summary>
/// Export a certificate to a PEM format string
/// </summary>
/// <param name="cert">The certificate to export</param>
/// <returns>A PEM encoded string</returns>
public static string ExportToPEM(X509Certificate cert)
{
    StringBuilder builder = new StringBuilder();            

    builder.AppendLine("-----BEGIN CERTIFICATE-----");
    builder.AppendLine(Convert.ToBase64String(cert.Export(X509ContentType.Cert), Base64FormattingOptions.InsertLineBreaks));
    builder.AppendLine("-----END CERTIFICATE-----");

    return builder.ToString();
}
person tyranid    schedule 19.01.2011
comment
Этот метод также можно было бы предложить как метод расширения, поместив его в статический класс и изменив его подпись на: public static string ExportToPEM(this X509Certificate cert) - person cel sharp; 21.09.2015
comment
Как ни странно, Base64FormattingOptions.InsertLineBreaks, похоже, ломается в столбце 76, а не в более обычном 64! - person Cocowalla; 19.09.2019

попробуй это:

X509Certificate2 cerifikata = new X509Certificate2("C://certificate.pfx");
File.WriteAllBytes("D://Test.cer",cerifikata.Export(X509ContentType.Cert));
person Arbnor    schedule 03.04.2011
comment
Да, это будет что-то вроде простого (в основном Windows) двоичного дампа в кодировке DER, который отлично работает с большинством утилит (certreq, keytool, opensSSL и т. Д.). Принятый ответ - это более стандартный формат PEM / ASN.1 (строка B-64). - person galaxis; 22.11.2018

Для тех, кто реализует что-то подобное в .NET Core, вот код, основанный на том, что сделал тиранид. Base64FormattingOptions.InsertLineBreaks не существует в .NET Core, поэтому мне пришлось реализовать свой собственный способ разбиения строк.

    // Certificates content has 64 characters per lines
    private const int MaxCharactersPerLine = 64;

    /// <summary>
    /// Export a certificate to a PEM format string
    /// </summary>
    /// <param name="cert">The certificate to export</param>
    /// <returns>A PEM encoded string</returns>
    public static string ExportToPem(this X509Certificate2 cert)
    {
        var builder = new StringBuilder();
        var certContentBase64 = Convert.ToBase64String(cert.Export(X509ContentType.Cert));
        // Calculates the max number of lines this certificate will take.
        var certMaxNbrLines = Math.Ceiling((double)certContentBase64.Length / MaxCharactersPerLine);

        builder.AppendLine("-----BEGIN CERTIFICATE-----");
        for (var index = 0; index < certMaxNbrLines; index++)
        {
            var maxSubstringLength = index * MaxCharactersPerLine + MaxCharactersPerLine > certContentBase64.Length
                ? certContentBase64.Length - index * MaxCharactersPerLine
                : MaxCharactersPerLine;
            builder.AppendLine(certContentBase64.Substring(index * MaxCharactersPerLine, maxSubstringLength));
        }
        builder.AppendLine("-----END CERTIFICATE-----");

        return builder.ToString();
    }
person David    schedule 15.09.2017
comment
var certContentBase64 = Convert.ToBase64String (cert.Export (X509ContentType.Cert), Base64FormattingOptions.InsertLineBreaks) - person prampe; 07.12.2018

// однако без "----- BEGIN CERTIFICATE -----" и "----- END CERTIFICATE -----"

Эти пропущенные строки не являются обязательными. CA может их генерировать или нет, в зависимости от настроек. По всем практическим причинам их можно удалить из файла, закодированного в Base64.

person Leve    schedule 07.05.2016