将证书导出为 BASE-64 编码的 .cer

Posted

技术标签:

【中文标题】将证书导出为 BASE-64 编码的 .cer【英文标题】:Exporting a Certificate as BASE-64 encoded .cer 【发布时间】:2011-06-11 23:36:24 【问题描述】:

我正在尝试将没有私钥的证书导出为 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-----”

【问题讨论】:

由于我必须使用过时的单声道框架,我求助于将 openssl 作为外部进程调用:openssl pkcs12 -in importPath -nokeys -passin pass: - 这适用于 linux 和 windows openssl 二进制文件。 【参考方案1】:

对于那些在 .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();
    

【讨论】:

var certContentBase64 = Convert.ToBase64String(cert.Export(X509ContentType.Cert), Base64FormattingOptions.InsertLineBreaks)【参考方案2】:

//但是,缺少“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”

这些缺失的行是可选的。 CA 可能会根据设置生成或不生成它们。出于所有实际原因,它们可以从 Base64 编码文件中删除。

【讨论】:

【参考方案3】:

试试这个:

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

【讨论】:

是的,这将执行类似直接(主要是 Windows)DER 编码的二进制转储的操作 - 与大多数实用程序(“certreq”、“keytool”、“opensSSL”等)一起工作正常。接受的答案是更标准的 PEM/ASN.1 格式(B-64 字符串)。【参考方案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();

【讨论】:

此方法也可以作为扩展方法提供,方法是将其放入静态类并将其签名更改为:public static string ExportToPEM(this X509Certificate cert) 奇怪的是,Base64FormattingOptions.InsertLineBreaks 似乎在第 76 列中断,而不是更多的usual 64!

以上是关于将证书导出为 BASE-64 编码的 .cer的主要内容,如果未能解决你的问题,请参考以下文章

如何导出cer证书及证书链的生成

java 证书 .cer 和 .pfx

数字证书

DER,CRT,CER,PEM证书以及如何转换它们

常见的数字证书格式

将 .pfx 转换为 .cer