X509Certificate2构造函数中的“指定的网络密码不正确”异常 - c#

我有一个控制台应用程序,它从字节数组中加载X509证书,如下所示:

var cert = new X509Certificate2(certificateContent,      // byte[]
                                password,                // string
                                X509KeyStorageFlags.PersistKeySet);

certificateContent是表示pfx文件内容的byte[]。该代码对我测试过的许多证书都适用。但是,我正在测试一个证书,该证书导致此行抛出CryptographicException并显示消息“指定的网络密码不正确。”,即使提供的密码正确无误。

奇怪的是,我可以在LinqPad中使用相同的代码从具有相同密码的相同pfx文件创建证书,并且可以正常工作。

我已经在调试器的控制台应用程序中检查了呼叫站点,并验证了是否传递了正确的值。

是什么导致该构造函数在控制台应用程序中抛出此异常,但在使用相同数据的LinqPad中却未抛出该异常,并且对于其他证书在两个地方都可以正常工作?

更多细节

证书存储在Base64的数据库中。 Console应用程序从数据库读取证书,将其从Base64转换为byte [],然后尝试如上所述创建X509Certificate2对象。

我一直在测试三个证书:

我的雇主CA提供的我的个人客户身份验证证书。
同事使用自己的自签名CA创建的测试证书。
我自己使用自签名CA创建的测试证书。

证书1和2在控制台应用程序和LinqPad中均按预期工作。

证书3在LinqPad中可以很好地加载,但是如果我尝试在控制台应用程序中使用它,则会生成上面的错误。

证书2和3之间有两个重要区别。

Cert2将于2016年到期,Cert3将于2039年到期
与cert2相关的私钥是2048位。 Cert3是1024位。

这些差异中的任何一个都可能导致“指定的网络密码不正确”错误吗?为何所有3个证书在LinqPad中都能正常工作,而在Console应用程序中只有1个抛出错误?

参考方案

希望这会帮助某人:

User "S C"指出Windows XP和Windows Server 2003上对证书密码的以下要求。

0 < password.Length < 32

我看到了关于是否允许32个的冲突报告。我可以确认我使用的是32个字符的密码(MD5哈希),并将其截断为30个字符可以解决此问题。

Java中的“ <<”运算符 - java

最喜欢的语句来自Java的Character类:(1 << Character.PARAGRAPH_SEPARATOR)) >> type PARAGRAPH_SEPARATOR是字节,type是整数。这句话中的操作员,他们做什么?如何以及在哪里可以使用这些运算符?这是oracles java.lang.Character文档。该类中…

当我运行python代码时,它说“ <<目前是意外情况” - python

基本上,这是我们合作者的python代码,用于生成网格,该网格是在Linux环境下开发的。我使用Cygwin在Windows上运行此代码。麻烦部分如下。 BiV_temp.geo也是一个python脚本。因此,命令是用预定义的数字和文件名替换脚本BiV_temp.geo中的字符串。os.system('cp BiV_fiber.geo BiV_te…

LeetCode题解拼凑硬币

小Q十分富有,拥有非常多的硬币,小Q拥有的硬币是有规律的,对于所有的非负整数K,小Q恰好各有两个面值为2^k的硬币,所有小Q拥有的硬币就是1,1,2,2,4,4,8,8.....小Q有一天去商店购买东西需要支付n元钱,小Q想知道有多少种方案从他拥有的硬币中选取一些拼凑起来恰好是n元(如果两种方案某个面值的硬币选取的个数不一样就考虑为不一样的方案)输入:输入包…

Python lmfit约束:a <b <c - python

我在Python中使用lmfit来拟合一些数据,其中包括拟合变量a,b和c。我需要确保a <b <c。我发现http://cars9.uchicago.edu/software/python/lmfit_MinimizerResult/constraints.html谈到需要定义为不等式和设置虚拟变量的约束。例如,如果我想要a + b <=…

LeetCode题解计算机为什么是基于二进制的?

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制