我有一个控制台应用程序,它从字节数组加载 X509 证书,如下所示:
var cert = new X509Certificate2(certificateContent, // byte[]
password, // string
X509KeyStorageFlags.PersistKeySet);
certificateContent
是byte[]
表示 pfx 文件内容的 a。此代码适用于我测试过的许多证书。但是,我正在测试一个证书CryptographicException
,即使提供的密码是正确的,它也会导致此行抛出一条消息“指定的网络密码不正确。”。
奇怪的是,我可以在 LinqPad 中使用相同的代码,使用相同的密码从相同的 pfx 文件创建证书,而且效果很好。
我已经在调试器的控制台应用程序中检查了调用站点,并验证了传入的值是否正确。
什么可能导致此构造函数在控制台应用程序中引发此异常,而不是在 LinqPad 中使用相同的数据,并且在其他证书的两个地方都可以正常工作?
更多细节
证书存储在 Base64 的数据库中。控制台应用程序从 DB 中读取证书,将其从 Base64 转换为 byte[],然后尝试X509Certificate2
按上述方式创建对象。
我一直在测试三个证书:
- 我的雇主的 CA 提供的我的个人客户身份验证证书。
- 同事使用自己的自签名 CA 创建的测试证书。
- 我自己使用自签名 CA 创建的测试证书。
证书 1 和 2 在控制台应用程序和 LinqPad 中都按预期工作。
证书 3 在 LinqPad 中加载良好,但如果我尝试在控制台应用程序中使用它,则会生成上述错误。
证书 2 和 3 之间有两个显着差异。
- Cert2 于 2016 年到期,Cert3 于 2039 年到期
- 与 cert2 关联的私钥是 2048 位。Cert3 是 1024 位。
这些差异中的任何一个是否会导致“指定的网络密码不正确”错误?为什么所有 3 个证书在 LinqPad 中都能正常工作,但只有 1 个在控制台应用程序中抛出错误?