我四处搜索并找不到很多信息,基本上我有Windows 2008 R2,我创建了PowerShell脚本,将PFX文件加载到Local Machine的证书存储区。
现在,我需要授予应用程序池的权限,以便使用PowerShell读取证书的私钥。
在Windows 2003的旧方式中,我只需要将实际文件放在C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\
文件夹中,但看起来Win 2008使用的是另一个文件夹。
有人有解决方案吗?
- 更新我的代码版本 -
function Grant-CertificatePermissions([string]$certSubject,[string]$user,[string]$permissionType,[string]$permission = $args[3])
{
$getCert = Get-LocalMachineCertificate $certSubject
$keypath = Get-CertificateStorePath
$certHash = $getCert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName
$certFullPath = $keypath+$certHash
$certAcl = Get-Acl -Path $certFullPath
try
{
$accessRule=new-object System.Security.AccessControl.FileSystemAccessRule $user, $permissionType, $permission
$certAcl.AddAccessRule($accessRule)
}
catch [System.Exception]
{
throw "Invalid User Id Or Permission"
}
Set-Acl $certFullPath $certAcl
}
function Get-LocalMachineCertificate([string]$subject, [string]$certificateStoreLocation, [string]$certificateStoreName)
{
$getCert = Get-ChildItem -Recurse Cert:\$certificateStoreLocation\$certificateStoreName | Where-Object {$_.Subject -eq $subject}
if(!$getCert)
{
throw "Certificate Not Found"
}
return $getCert
}
function Get-CertificateStorePath
{
$commonCertPathStub = "\Microsoft\Crypto\RSA\MachineKeys\"
$programData = $Env:ProgramData
if(!$programData)
{
$programData = $Env:ALLUSERSPROFILE + "\Application Data"
}
$keypath = $programData + $commonCertPathStub
return $keypath
}
在我的Get-CertificateStorePath
函数中,我得到C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\
的值,在获得证书哈希后,完整文件看起来像C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\d82829f7770ea5d85ef978dea67f302d_4cca7190-7e9f-46d7-b180-6656fec432e2
,当我执行Get-Acl
行时我有异常Cannot find path 'C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\d82829f7770ea5d85ef978dea67f302d_4cca7190-7e9f-46d7-b180-6656fec432e2' because it does not exist.
。
我浏览了那个文件夹,我确实找不到这样的文件。
- 更新 -
function Import-PfxCertificate ([String]$certPath,[String]$certificateStoreLocation ,[String]$certificateStoreName, $pfxPassword)
{
$pfx = new-object System.Security.Cryptography.X509Certificates.X509Certificate2
$pfx.Import($certPath, $pfxPassword, "Exportable,PersistKeySet")
$store = new-object System.Security.Cryptography.X509Certificates.X509Store($certificateStoreName,$certificateStoreLocation)
$store.open("MaxAllowed")
$store.add($pfx)
$store.close()
return $pfx
}
答案 0 :(得分:2)
2008 R2使用C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
通过PowerShell,您可以在此处查看IIS可用的证书:
cert:\LocalMachine\My
您可以访问该位置并查找您的证书。找到后,您可以使用以下方式查看其私钥ID:
$cert = get-item 2779B37AE3625FD8D2F9596E285C7CDC15049D87
$cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName
这将包含MachineKeys文件夹中的长十六进制文件名。
然后,您可以使用Set-Acl
cmdlet更改文件权限。
您还可以通过证书MMC mmc/add snapin/certificates/computer account/local computer
然后certificates/personal/certificates/[your cert]/all tasks/manage private keys
答案 1 :(得分:0)
如果将证书从User Store \ Personal拖放到Computer Store \ Personal,则$ getCert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName值是错误的。没有包含该值的文件。在正确的商店中再次导入证书,它将起作用。
答案 2 :(得分:0)
这是一个完整的PowerShell脚本,可以为证书私钥上的任何用户授予权限。
How to Grant permission to user on Certificate private key using powershell?
上面的链接有脚本和示例如何在powershell控制台窗口上运行它。
如果您使用的是ApplicationPoolIdentity,那么您的用户名将是'IIS AppPool \ AppPoolNameHere'
注意:您需要使用'',因为IIS和AppPool之间有空格。