从PEM文件生成X509Certificate2时遇“Cannot find the requested object”异常求助
解决“Cannot find the requested object”异常问题
问题根源
你代码里读取的是证书签名请求(CSR)文件,但X509Certificate2类仅能加载已签发完成的X.509证书,无法直接解析CSR。两者的PEM格式有明确区别:CSR以-----BEGIN CERTIFICATE REQUEST-----开头,而合法证书以-----BEGIN CERTIFICATE-----开头。
解决方案分两种场景:
场景1:确实需要处理CSR(而非证书)
如果要解析或使用CSR,需用CertificateRequest类替代X509Certificate2,示例代码如下:
string csrPath = @"C:\Users\h541525\csrgenerate.pem"; string csrPem = File.ReadAllText(csrPath); // 提取CSR的Base64核心内容 byte[] csrBytes = Convert.FromBase64String( csrPem.Replace("-----BEGIN CERTIFICATE REQUEST-----", "") .Replace("-----END CERTIFICATE REQUEST-----", "") .Replace("\r", "") .Replace("\n", "") ); // 加载CSR对象 CertificateRequest csr = CertificateRequest.LoadSigningRequest(csrBytes, out _); // 可按需操作CSR,例如获取请求主题、公钥信息 Console.WriteLine(csr.Subject);
场景2:误将CSR当成证书,实际需加载已签发证书
- 先确认目标文件是合法证书:检查文件开头是否为
-----BEGIN CERTIFICATE-----,若不是,需获取CA签发的证书文件(通常为.crt或.pem格式)。 - 修正加载证书的代码:
string certPath = @"C:\Users\h541525\your-issued-certificate.pem"; string certPem = File.ReadAllText(certPath); // 提取证书的Base64核心内容 byte[] certBytes = Convert.FromBase64String( certPem.Replace("-----BEGIN CERTIFICATE-----", "") .Replace("-----END CERTIFICATE-----", "") .Replace("\r", "") .Replace("\n", "") ); // 加载证书对象 X509Certificate2 certificate = new X509Certificate2(certBytes);
额外注意事项
- 若你的
GetBytesFromPem方法未正确移除PEM头部、尾部及换行符,也会导致解析失败,建议直接使用上述示例中的字符串处理方式提取Base64内容。 - 若证书带密码保护,需在构造
X509Certificate2时传入密码参数:new X509Certificate2(certBytes, "your-cert-password")。
内容的提问来源于stack exchange,提问作者Aravindh
相关产品推荐
相关产品推荐

