ASP.NET 4.5中如何基于PEM文件生成X509Certificate2对象
问题根因
- 你传入的
CERTIFICATE REQUEST(CSR,证书签名请求)不是合法的X509证书文件,合法证书的PEM头尾是-----BEGIN CERTIFICATE-----/-----END CERTIFICATE-----,CSR仅用于向CA提交签发申请,本身不包含证书签名信息,无法直接用于生成X509Certificate2对象,这是触发你当前报错的直接原因 - X509Certificate2构造函数的第二个参数是证书/PFX包的访问密码,不是RSA私钥的明文内容,你当前把私钥内容作为密码传入的逻辑完全错误
- PEM文件头尾中间的内容是Base64编码格式,你直接转ASCII字节没有做Base64解码,会导致内容无法被加密模块识别
解决方案(ASP.NET 4.5 环境)
首先你需要先将CSR提交给CA(内部CA/公开CA)签发,拿到正式的PEM格式证书文件后再执行后续操作。
推荐使用BouncyCastle加密库实现PEM证书+私钥合并生成X509Certificate2对象,操作步骤如下:
- 先安装BouncyCastle NuGet包:
Install-Package BouncyCastle -Version 1.8.9(该版本兼容.NET Framework 4.5) - 参考代码示例:
using System; using System.IO; using System.Security.Cryptography.X509Certificates; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Pkcs; using Org.BouncyCastle.X509; public static X509Certificate2 GetX509Certificate2(string certPemPath, string privateKeyPemPath, string pfxPassword = "temp123") { // 加载正式PEM证书 X509Certificate cert; using (var reader = File.OpenText(certPemPath)) { cert = (X509Certificate)new PemReader(reader).ReadObject(); } // 加载RSA私钥 AsymmetricCipherKeyPair privateKey; using (var reader = File.OpenText(privateKeyPemPath)) { privateKey = (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject(); } // 合并证书和私钥生成PFX包 var store = new Pkcs12Store(); var certEntry = new X509CertificateEntry(cert); store.SetCertificateEntry(cert.SubjectDN.ToString(), certEntry); store.SetKeyEntry(cert.SubjectDN.ToString(), new AsymmetricKeyEntry(privateKey.Private), new[] { certEntry }); using (var pfxStream = new MemoryStream()) { store.Save(pfxStream, pfxPassword.ToCharArray(), new Org.BouncyCastle.Security.SecureRandom()); pfxStream.Position = 0; // 从PFX流加载X509Certificate2,添加存储标记适配ASP.NET运行场景 return new X509Certificate2(pfxStream.ToArray(), pfxPassword, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet); } }
如果需要生成本地PFX文件,只需要把上述代码中pfxStream的内容写入本地.pfx后缀的文件即可。
内容的提问来源于stack exchange,提问作者Bastian Salazar
相关产品推荐
相关产品推荐

