【问题标题】:Why X509Certificate2 gets Internal Error only if the password is correct为什么 X509Certificate2 只有在密码正确的情况下才会出现内部错误
【发布时间】:2015-06-25 17:49:49
【问题描述】:

我试图理解为什么在 .NET 中调用构造函数 System.Security.Cryptography.X509Certificates.X509Certificate2() 在传递文件名和匹配密码时失败并出现“内部错误”。这发生在 Windows 2008 R2 服务器上。在另一台运行 Windows 7 的机器上,调用使用相同的文件名和密码正常工作(实际上,我尝试使用两对不同的文件和密码并得到相同的结果)。我希望只有在 Windows 2008 R2 服务器上必须启用(或禁用)一些设置才能使该命令正常工作。 (服务器具有更严格的安全性,所以它可能会阻止某些东西?)但为了更好地理解问题,我想我需要更好地了解 .X509Certificate2() 实际在做什么。

对于初学者,以下两个命令在两台机器上都可以正常工作:

    var x = new X509Certificate2();
    var y = new X509Certificate2(fullFilePath);

但是,如果密码正确,任何采用密码的重载都将在 Windows 2008 R2 服务器上失败,但在 Windows 7 计算机上则不会。 (两者都是 64 位。)例如:

    var z = new X509Certificate2(fullFilePath, password);

如果我(在任何一台机器上)传递的密码不正确或为空,则会收到“指定的网络密码不正确”。但是,如果密码正确,则 Windows 2008 R2 服务器会显示“发生内部错误”。

这让我相信在 X509Certificate2 代码的某处,如果发现密码匹配,则会采取另一项行动,这就是失败的行动。

我确实通过谷歌搜索找到了一些关于源代码的信息,并把我带到了这里:

http://www.dotnetframework.org/default.aspx/4@0/4@0/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/fx/src/security/system/security/cryptography/x509/X509Certificate2@cs/1305376/X509Certificate2@cs

...但我仍然难以理解发生了什么。显然,无论传递什么参数,它们都会在这一行中以某种方式处理:

m_safeCertContext = CAPI.CertDuplicateCertificateContext(this.Handle);

...但是我还没有找到它的源代码。

实际上,我希望找到可能有人知道“哦,是的,在 Windows 2008 服务器上,您必须确保启用 xyz 才能使 X509Certificate2() 工作,并且您所要做的一切是...”,或者除了该文件在指定位置之外,机器上还必须有其他东西才能让构造函数工作。

我的最终目标是让程序在服务器上运行,就像在另一台机器上运行一样。但是,仅了解一些关于我进行此调用时发生的确切逻辑的信息(以及在发现密码匹配后执行的操作)将有很大帮助。

感谢任何见解!

【问题讨论】:

标签: c# asp.net windows windows-server-2008-r2


【解决方案1】:

试试

var certificate = new X509Certificate2(fileName, password, X509KeyStorageFlags.MachineKeySet);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 2011-07-05
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 2020-10-18
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多