У меня есть код, который я получил отсюда, который был / был весьма полезен, проблема в том, что он работает только для сертификатов с низким RSA, ситуация в том, что мне нужно дать разрешение пользователю в этом сертификате PKCS12, я есть дешевый способ сделать это, потому что я знаю, где ключ будет вставлен:
try{
$vReport = $Report.startname -replace '\.\\', "$($env:computername)\"
$Rule = new-object -typename System.Security.AccessControl.FileSystemAccessRule -Argumentlist $vReport, $Permission, Allow
$Root = "c:\programdata\microsoft\crypto\Keys\"
$Path = ls Cert:\LocalMachine\My\ | where {$_.thumbprint -like $Thumbprint}
$Path | foreach {
$Privatekey = Get-ChildItem -Path $Root | Sort-Object -Descending LastWriteTime | select name -First 1
$KeyPath = Join-Path -Path $Root -ChildPath $Privatekey.Name
if([io.file]::exists($KeyPath)){
$acl = get-acl -Path $KeyPath
$acl.AddAccessRule($Rule)
echo $KeyPath
set-acl -AclObject $acl -path $KeyPath
}
}
}
Catch{
Write-Warning "An Exception was caught: $_"
}
}
Он работает, но один из моих коллег спросил меня: «Представьте, что мы оба на одном сервере и вставляем 2 разные сертификаты? ", если он реализует свой сертификат несколько позже c, он вставит пользователя в неправильный закрытый ключ. После долгих поисков я обнаружил, что сертификат имеет идентификатор ключа субъекта, который совпадает с ключом в реестре. Может ли это быть решением? Если так, как получить это? Потому что я без конца пытался (в рамках моих знаний).
UPDATE : обнаружил, что с помощью свойства $ _. Extension.Privatekeyidentifier вы получаете имя ключа в реестре. Другой вопрос, который у меня есть, как мне их сопоставить, чтобы он мог go в нужную папку найти ключ, который используется совместно с сертификатом?