仅当密码正确时,为什么X509Certificate2会出现内部错误

时间:2015-04-18 22:21:03

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

我试图理解为什么在.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服务器上,你必须确保为x509Certificate2()启用xyz才能工作,并且你所要做的就是..."或者除了该文件位于指定位置以供构造函数工作之外,机器上还必须有其他东西。

我的最终目标是让程序在服务器上运行,就像在另一台机器上运行一样。但是,只要掌握一些关于我在进行此调用时所发生的事情的逻辑的信息(以及在发现密码匹配后执行的内容)将会有很大的帮助。

任何见解都表示赞赏!

1 个答案:

答案 0 :(得分:0)

尝试

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