winhttpcertcfg可以在Windows 7中为IIS用户提供访问权限

14

我需要给予IIS用户访问pfx证书的权限。该网站在某个名为AppPoolUser的用户下运行。IIS自动拥有用户名 "IIS APPPOOL\AppPoolUser",这是我们在使用aspnet_regiis -ga时需要授予访问权限的用户。

然而,当我使用winhttpcertcfg授予用户"IIS APPPOOL\AppPoolUser"访问权限时,它会显示"未找到帐户信息"。

我使用的命令是:

winhttpcertcfg -i <filename> -c <certificateLocation> - g -a <account name>

我在网上没有找到任何关于此的示例。有什么想法吗?


请查看此链接:http://weblogs.asp.net/hernandl/archive/2005/02/09/WinHttpCertCfgTool.aspx 谢谢, Vivek - Vivek
我已经尝试了那个示例。我的证书现在可以访问许多用户。池用户、域管理员、每个人……看起来应用程序域正在运行在“LocalSystem”下,我没有找到给这个用户授权的方法,正如文档所说,这个用户已经具有管理员权限。 - bkhanal
7个回答

12

我知道这是一个老问题,但昨天我遇到了同样的问题,所以我想回答一下。

我也遇到了同样的问题,但证书位于LocalMachine -> TrustedPeople存储中...

你需要使用icacls而不是WinHttpCertCfg,可以从此链接获取。

基本上,它应该看起来像这样:

ICACLS <filename> /grant "IIS AppPool\DefaultAppPool":R

为了完整起见,这里是我需要做的步骤来访问“受信任的人”存储库。部分内容引用自此链接
  1. Use the FindPrivateKey tool from Microsoft to locate the actual file for the cert in the store. This tool must be compiled from the source code in .\WF_WCF_Samples\WCF\Setup\FindPrivateKey\CS from the Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 download.

    FindPrivateKey.exe TrustedPeople LocalMachine -t "<thumbprint of the SSL cert>"
    
  2. Use icacls on the file given by FindPrivateKey.

    icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\<path to certificate> /grant "IIS AppPool\<your AppPool name>":R
    

看这里!


你拯救了我的理智。这值得一次点赞。 - Tim Hardy
使用ICACLS授予PFX文件给应用程序池后,我应该在web.config的clientCredentials中放置什么内容? - Anders Lindén

8

对于原始帖子,您只需要将域名“IIS APPPool”替换为您机器的本地域名 - 通常与计算机名称相同。当WinHttpCertCfg运行时,它将把<MachineName>\<AppPoolUser>转换为<IIS APPPOOL>\<AppPoolUser>,并授予访问证书的权限。如果您想在具有本地IIS的开发桌面上工作,这应该可以解决您的问题。ICACLS仅适用于服务器(您最终将部署到此服务器)。


+1 确实,这对我有效:winhttpcertcfg.exe -g -c LOCAL_MACHINE\My -s MyCertName -a "MYMACHINENAME\Name Of App Pool" - Lynn Crumbling
如果您想要一个更容易在多台服务器上运行的脚本,localhost也可以代替特定的机器名称。 - explunit
2
顺便提一下,我需要包括机器名称和IIS AppPool,例如:winhttpcertcfg.exe -g -c LOCAL_MACHINE\My -s MyCertName -a "MYMACHINENAME\IIS AppPool\AppPoolUser" - Scott Mitchell

6

您还可以通过 mmc 证书管理器执行此操作。

只需右键点击要操作的证书,选择 All Tasks -> 管理私钥...,然后添加您想要的用户(通常为 IIS APPPOOL\[您的应用程序池名称])。


1
这在我的Windows 7上似乎没有出现。但我希望它能出现。 - Ian Grainger
我记得我是在Win7下完成了所有这项工作。现在正在使用OSX,手头没有Win7虚拟机,否则我会再次查看。你可能没有保存私钥吗? - Ben Mosher
太好了,我只需要将位置更改为我的本地服务器,而不是网络域。 - Guilherme de Jesus Santos
我无法在我的工作虚拟机上以这种方式实际管理私钥。对于其他遇到同样困难的人,当Windows 8.1中添加用户的UX拒绝帮助我的时候,icacls命令行确实起作用。 - Tim Hardy
这对我在Windows Server 2008上起作用了,但只是通过一个把戏。我的证书需要存储在“受信任的人”中,然而当密钥位于此位置时,该菜单选项不存在。这个把戏是将密钥移动到“个人”中,选择“所有任务->管理私钥”,然后再将其移回来。 - nullPainter
谢谢!我花了4个小时来解决这个问题。我通过授予IIS_IUSRS权限来解决它,因为X509CertificateProvider.GetPrivateKey找不到证书。 - rasputino

6

更新/tl;dr — 我已经为PowerShell Core创建了CertAdmin模块,以便轻松获取和设置证书权限。

我遇到了相同的问题:

  • WinHttpCertCfg似乎已被废弃而没有合理的替代方案。
  • 我的证书管理器中没有“管理私钥”选项,如此旧MSDN博客文章所述。
  • 在Windows环境中编译FindPrivateKey是不合理的开销。

设置证书的权限涉及将应用程序池授予读取证书文件的权限。

这可以使用icacls.exe实现(Windows资源管理器安全性UI不支持应用程序池):

icacls C:\ProgramData\Microsoft\crypto\rsa\machinekeys\9876abcdeblahblahblah /grant "IIS AppPool\AppPoolName:R" 

Windows将机器密钥存储在C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys中,但文件名与证书无关。可以使用以下PowerShell代码获取每个证书的文件名:

 ls Cert:\LocalMachine\TrustedPeople |
    select Subject,@{n='FileName';e={$_.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName}} |
    Format-List

如果您的证书存储在其他位置,请更改“TrustedPeople”。

应用程序池的名称可以从IIS管理器的“应用程序池”节点获取,也可以通过运行此PowerShell代码获得:

Import-Module WebAdministration; ls IIS:\AppPools

这个PowerShell 3脚本将使用Out-GridView (ogv)作为证书和应用程序池的GUI选择列表,然后授予权限:

ipmo WebAdministration
$cert = (ls Cert:\LocalMachine\TrustedPeople |
    ogv -OutputMode Single -Title "Select Certificate").
    PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName
$app = (ls IIS:\AppPools |
    ogv -OutputMode Single -Title "Select App Pool").Name
icacls $env:ProgramData\Microsoft\crypto\rsa\machinekeys\$cert /grant "IIS AppPool\$($app):R"

这是一个很好的答案,因为你不必使用FindPrivateKey - 只需使用纯PowerShell即可。顺便说一句,在Windows中,像添加权限这样基本而简单的操作如此复杂,真是遗憾。 - Andrzej Martyna

3
安装该应用程序时,还会添加文档:C:\ Program Files(x86)\ Windows Resource Kits \ Tools 。以下示例展示了配置工具的一些使用方式。该命令列出了可以访问注册表LOCAL_MACHINE分支下“Root”证书存储中“MyCertificate”证书的私钥的帐户。
winhttpcertcfg -l -c LOCAL_MACHINE\Root -s MyCertificate

这个命令会授予TESTUSER账户在“My”证书存储中,“MyCertificate”证书的私钥访问权限。
winhttpcertcfg -g -c LOCAL_MACHINE\My -s MyCertificate -a TESTUSER

这个命令可以从PFX文件中导入证书和私钥,并将私钥访问权限扩展到另一个账户。
winhttpcertcfg -i PFXFile -c LOCAL_MACHINE\My -a IWAM_TESTMACHINE

该命令会使用指定的证书,移除对于IWAM_TESTMACHINE账户私钥的访问权限。
winhttpcertcfg -r -c LOCAL_MACHINE\Root -s MyCertificate -a IWAM_TESTMACHINE

4
复制黏贴文档内容,特别是当文档本身有问题时,是不可取的。 - Roger Lipscombe

2
如果您仍想继续使用wihHttpCertCfg,请使用以下命令:
winhttpcertcfg.exe -i <filename> -c <certificateLocation> -a "ComputerName\IIS APPPOOL\AppPoolName"

我曾经遇到相同的问题,今天通过上述命令解决了它。


0

对我来说有效的方法是将我的暂存网站设置为网络服务 (应用池) (部署),而在本地环境中则设置为 "applicationpoolidentity" (工作副本)

只需将其更改为 applicationpoolidentity 并运行您的 winhttpcertcfg 命令即可


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接