更新/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'
Format-List
如果您的证书存储在其他位置,请更改“TrustedPeople”。
应用程序池的名称可以从IIS管理器的“应用程序池”节点获取,也可以通过运行此PowerShell代码获得:
Import-Module WebAdministration
这个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"