C#中如何通过代码实现.crt文件转换为.pem文件
C# 实现DER编码.crt证书转PEM格式方案
你给出的OpenSSL转换命令openssl x509 -inform der -in file.crt -out file.pem,核心是将二进制DER编码的X.509证书转换为带固定头尾标记的Base64编码PEM格式,用C#内置类库即可实现,无需依赖外部OpenSSL环境。
前置校验:部分.crt文件本身就是PEM编码格式,只是后缀名命名为.crt,这类文件无需转换,直接修改后缀为.pem即可正常使用。
方法1:适用于.NET 5+、.NET Core 3.0+ 版本
新版.NET的加密类库内置了PEM格式导出API,代码最简:
using System.Security.Cryptography.X509Certificates; // 替换为实际文件路径 string inputCrtPath = @"C:\your\path\file.crt"; string outputPemPath = @"C:\your\path\file.pem"; // 加载DER格式证书 using X509Certificate2 cert = new X509Certificate2(inputCrtPath); // 直接导出标准PEM格式内容 string pemContent = cert.ExportCertificatePem(); // 写入目标文件 File.WriteAllText(outputPemPath, pemContent);
方法2:兼容.NET Framework、.NET Core 2.x及更早版本
旧版本没有内置PEM导出API,按照PEM格式规范手动拼接即可,输出结果和OpenSSL命令完全一致:
using System; using System.IO; using System.Security.Cryptography.X509Certificates; using System.Text; // 替换为实际文件路径 string inputCrtPath = @"C:\your\path\file.crt"; string outputPemPath = @"C:\your\path\file.pem"; // 读取DER格式证书二进制内容 byte[] crtBytes = File.ReadAllBytes(inputCrtPath); using X509Certificate2 cert = new X509Certificate2(crtBytes); byte[] certRawData = cert.RawData; // 对二进制内容做Base64编码 string base64Content = Convert.ToBase64String(certRawData); // 按PEM规范拼接内容,每64个字符插入换行 StringBuilder pemBuilder = new StringBuilder(); pemBuilder.AppendLine("-----BEGIN CERTIFICATE-----"); for (int i = 0; i < base64Content.Length; i += 64) { int lineLen = Math.Min(64, base64Content.Length - i); pemBuilder.AppendLine(base64Content.Substring(i, lineLen)); } pemBuilder.AppendLine("-----END CERTIFICATE-----"); // 写入文件,PEM使用ASCII编码即可 File.WriteAllText(outputPemPath, pemBuilder.ToString(), Encoding.ASCII);
注意事项
- 如果加载证书时抛出异常,先排查源.crt文件是否损坏、是否为DER编码的X.509证书,PFX/P12等带私钥的证书容器格式不适用该转换逻辑。
- 以上两种方法导出的PEM文件,和OpenSSL对应命令的输出格式、内容完全一致,可直接用于所有支持PEM证书的场景。
内容的提问来源于stack exchange,提问作者Gregori Schuster
相关产品推荐
相关产品推荐

