【发布时间】: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 代码的某处,如果发现密码匹配,则会采取另一项行动,这就是失败的行动。
我确实通过谷歌搜索找到了一些关于源代码的信息,并把我带到了这里:
...但我仍然难以理解发生了什么。显然,无论传递什么参数,它们都会在这一行中以某种方式处理:
m_safeCertContext = CAPI.CertDuplicateCertificateContext(this.Handle);
...但是我还没有找到它的源代码。
实际上,我希望找到可能有人知道“哦,是的,在 Windows 2008 服务器上,您必须确保启用 xyz 才能使 X509Certificate2() 工作,并且您所要做的一切是...”,或者除了该文件在指定位置之外,机器上还必须有其他东西才能让构造函数工作。
我的最终目标是让程序在服务器上运行,就像在另一台机器上运行一样。但是,仅了解一些关于我进行此调用时发生的确切逻辑的信息(以及在发现密码匹配后执行的操作)将有很大帮助。
感谢任何见解!
【问题讨论】:
-
这是您使用的两个构造函数之间的区别:"Calling this constructor with the correct password decrypts the private key and saves it to a key container."。也许运行您的代码的用户可以访问证书,但不能访问私钥。查看此博客:paulstovell.com/blog/x509certificate2,特别是第 3 节。
-
我认为这些答案是正确的。尝试保存到容器时可能出现权限错误。如果我不想在核心代码中编辑该行,我可以在该机器的哪个位置为 IIS 7.5 / ASP.NET 4.0 授予密钥容器所需的权限?
标签: c# asp.net windows windows-server-2008-r2