从 IIS 上的 LocalComputer 存储“Store_1”获取证书
Posted
技术标签:
【中文标题】从 IIS 上的 LocalComputer 存储“Store_1”获取证书【英文标题】:Get certificate from LocalComputer store "Store_1" on IIS 【发布时间】:2014-09-06 23:34:02 【问题描述】:我正在开发用于数字签名的多租户 ASP.NET Web 应用程序。 在存储位置“本地计算机”(StoreLocation.LocalMachine) 中为每个名为“Tenant_TenantId”的租户证书存储创建。
在具有本地管理员权限的帐户下运行的 Windows 应用程序一切正常。 当从托管在 IIS 上的 ASP.NET 应用程序使用相同的库时,只有“本地系统”身份才能使用证书。
我尝试使用本地管理员用户帐户并获得异常访问被拒绝:
System.Security.Cryptography.CryptographicException: Access is denied.
IIS下的代码有什么限制吗?如何授予用户/代码读取证书权限(从特定证书位置/存储)?
应用程序托管在 Windows Server 2012R2 / IIS 8.5 / ASP.NET 4.5 上
【问题讨论】:
代码运行在Application Pool身份下,试试改成管理员看看有没有帮助 我试图在本地管理员帐户下运行 IIS 池,但它不起作用,我得到了描述的异常。 为什么您使用“本地机器”而不是“当前用户”作为用于数字签名的证书? 是的,我们可以使用“当前用户”存储。我认为“本地机器”更有意义,因为我们想提供多租户服务,因此特定证书不“属于”运行服务的用户,而是服务/服务器。也许这是一个哲学上的差异,但这可以回到技术论点。 【参考方案1】:您可以尝试 3 个选项。
1) 使用 MMC(本地计算机的证书管理单元)。
如果您的商店 (Store1) 列在“证书(本地计算机)”节点下,请找到您的证书。如果存储未列出,请尝试使用“证书(本地计算机)”节点的上下文菜单中的命令搜索证书:查找证书...(查找范围:所有证书存储)。 找到证书后,您应该将其拖放到个人商店,然后从其上下文菜单中选择所有任务 -> 管理私钥,授予对帐户的访问权限,最后将其拖放回您的商店。
基于this answer
2) 使用WinHttpCertCfg.exe 授予对证书私钥的访问权限
winhttpcertcfg -g -c LOCAL_MACHINE\<your-store-name> -s <cert-subject> -a <IIS-app-pool-account>
3) 如果您需要在代码中授予访问权限,请查看solution in powershell(您可以在 C# 中轻松实现)
【讨论】:
这肯定是最好的答案 :) 我会研究在 IIS 下运行的代码是否有限制,如果您找到任何相关信息,请添加到您的答案中。 我相信IIS下的代码没有MSSQL中的主机保护属性和CLR集成编程等限制,至少在集成模式下是这样。想到的唯一区别是 AppPool 的服务进程使用非交互式登录类型。要调查问题的根源,您可以阅读 msdn.microsoft.com/en-us/library/windows/desktop/… 和 paulstovell.com/blog/x509certificate2 并使用后一篇文章的“提示 8:了解要使用的工具”部分中的工具。不要忘记监控安装和访问证书的过程!以上是关于从 IIS 上的 LocalComputer 存储“Store_1”获取证书的主要内容,如果未能解决你的问题,请参考以下文章
从 IIS 上的 ASP.NET Core 应用程序请求超时
我无法从 Windows 托管的 Web API 上的 IIS 访问 wkhtmltopdf