【问题标题】:ASP.NET X509Certificate2 access denied when hosted in IIS在 IIS 中托管时,ASP.NET X509Certificate2 访问被拒绝
【发布时间】:2022-01-04 05:39:48
【问题描述】:

我正在使用下面的 ASP.NET 代码从文件夹加载 pfx 文件

var certificatePath = $"{HttpContext.Current.Server.MapPath("~")}{certFolderName}\\{certFileName}";
return new X509Certificate2(certificatePath, certPassword, X509KeyStorageFlags.MachineKeySet);

此代码在本地 IIS 中运行良好。然而,当移动到我们的 QA 服务器时,相同的代码会引发访问被拒绝错误,如下所示。

我浏览了许多论坛并了解到这主要是访问文件夹 C:\ProgramData\Microsoft\Crypto\RSA\MachineKey 时的权限问题。我已经在我们的服务器中验证了对该文件夹的访问权限,并且一切正常。 'Everyone' 用户具有读写权限。所以理想情况下不应该有任何访问被拒绝错误。我什至明确授予了对 App Pool 身份的完全控制访问权限,但仍然无法正常工作。 我正在尝试了解还有什么可能导致此访问被拒绝问题。

【问题讨论】:

  • 您可以尝试将您的用户指定为专用应用程序池的身份,更多信息您可以参考此链接:Application Pool Identities

标签: asp.net iis x509certificate access-denied x509certificate2


【解决方案1】:

return new X509Certificate2(certificatePath, certPassword, X509KeyStorageFlags.MachineKeySet);

问题出在最后一个参数上。您的应用程序(应用程序池身份)无权访问本地机器存储。如果必须仅在运行时访问密钥,则应使用当前用户存储(用于持久密钥存储)或临时存储。

【讨论】:

  • 我已授予访问本地计算机密钥存储 (C:\ProgramData\Microsoft\Crypto\RSA\MachineKey) 的必要权限。但是还是不行。
  • 在机器存储中存储密钥有什么意义?
  • 我正在尝试从文件系统中的 pfx 文件而不是从证书存储中加载证书。当我们从文件加载证书时,它应该将其私钥临时存储在 C:\ProgramData\Microsoft\Crypto\RSA\MachineKey 文件夹中。这就是授予此文件夹访问权限的原因。
  • its supposed to store its private keys temporarily -- 这是一个非常错误的假设。密钥存储取决于它的使用方式和位置。在 Web 应用程序运行时中获取私钥通常表明该密钥根本不能持久化,因此存储标志应为Ephemeral,它在句柄有效时将密钥存储在内存中。
  • Ephemeral 在我们当前使用的 .NET Framework 4.6 中不受支持。升级框架是一项艰巨的工作。所以我正在寻找当前框架版本支持的选项。另外,我不能选择当前用户存储选项,因为我们在将 IIS 应用程序池中的 LoadUserProfile 设置设置为 true 时受到限制
猜你喜欢
  • 2020-10-27
  • 2011-08-03
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
相关资源
最近更新 更多