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

var cert = new X509Certificate2(certificateContent,      // byte[]
                                password,                // string
                                X509KeyStorageFlags.PersistKeySet);
certificateContent是表示pfx文件内容的byte[]。该代码对于我测试过的许多证书都可以正常工作。但是,我正在测试一个证书,该证书会导致此行抛出带有消息“指定的网络密码不正确。”的CryptographicException,即使提供的密码正确也是如此。

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

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

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

更多详细信息

证书存储在Base64的数据库中。控制台应用程序从数据库读取证书,将其从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个字符可以解决此问题。

    关于c# - X509Certificate2构造函数中的"The specified network password is not correct"异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17176067/

    10-12 07:40
    查看更多