更新/tl;博士——我已经创建了CertAdmin模块,以便轻松获取和设置证书权限。
我遇到了同样的问题:
设置证书的权限涉及授予应用程序池对证书文件的读取权限。
这可以使用 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"