web-dev-qa-db-ja.com

証明書をBASE-64エンコード.cerとしてエクスポートする

秘密鍵なしで証明書を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)))

しかし、それはうまくいくようですが、「----- BEGIN CERTIFICATE -----」と「----- END CERTIFICATE -----」が欠落しています

33
Saif Khan

たぶん

/// <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();
}
60
tyranid

これを試して:

X509Certificate2 cerifikata = new X509Certificate2("C://certificate.pfx");
File.WriteAllBytes("D://Test.cer",cerifikata.Export(X509ContentType.Cert));
6
Arbnor

.NET Coreで似たようなものを実装する場合は、tyranidが行ったことに基づいたコードがあります。 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();
    }
1
David

//ただし、「----- BEGIN CERTIFICATE -----」および「----- END CERTIFICATE -----」が欠落している

これらの欠落した行はオプションです。 CAは、設定に応じて生成する場合としない場合があります。すべての実用的な理由から、それらはBase64エンコードファイルから削除できます。

0
Leve