it-swarm-pt.tech

Como conceder permissão ao usuário na chave particular do certificado usando o powershell?

O certificado já está instalado na máquina. Agora eu quero dar permissão de leitura no PrivateKey of Certificate para o usuário do aplicativo.

14
Balpreet Patil

Aqui está a resposta.

Criado um arquivo de script PowerShell AddUserToCertificate.ps1

Aqui está o conteúdo do arquivo de script.

param(
    [string]$userName,
    [string]$permission,
    [string]$certStoreLocation,
    [string]$certThumbprint
);
# check if certificate is already installed
$certificateInstalled = Get-ChildItem cert:$certStoreLocation | Where thumbprint -eq $certThumbprint

# download & install only if certificate is not already installed on machine
if ($certificateInstalled -eq $null)
{
    $message="Certificate with thumbprint:"+$certThumbprint+" does not exist at "+$certStoreLocation
    Write-Host $message -ForegroundColor Red
    exit 1;
}else
{
    try
    {
        $rule = new-object security.accesscontrol.filesystemaccessrule $userName, $permission, allow
        $root = "c:\programdata\Microsoft\crypto\rsa\machinekeys"
        $l = ls Cert:$certStoreLocation
        $l = $l |? {$_.thumbprint -like $certThumbprint}
        $l |%{
            $keyname = $_.privatekey.cspkeycontainerinfo.uniquekeycontainername
            $p = [io.path]::combine($root, $keyname)
            if ([io.file]::exists($p))
            {
                $acl = get-acl -path $p
                $acl.addaccessrule($rule)
                echo $p
                set-acl $p $acl
            }
        }
    }
    catch 
    {
        Write-Host "Caught an exception:" -ForegroundColor Red
        Write-Host "$($_.Exception)" -ForegroundColor Red
        exit 1;
    }    
}

exit $LASTEXITCODE

Agora execute-o como parte da implantação. Exemplo para executar o script acima na janela do console do powershell. 

C:\>.\AddUserToCertificate.ps1 -userName testuser1 -permission read -certStoreLocation \LocalMachine\My -certThumbprint 1fb7603985a8a11d3e85abee194697e9784a253

este exemplo fornece read permission para o usuário testuser1 no certificado que em instalado em\LocalMachine\My e tem impressão de polegar 1fb7603985a8a11d3e85abee194697e9784a253

Se você estiver usando ApplicationPoolIdentity, seu nome de usuário será 'IIS AppPool\AppPoolNameHere'

Nota : Você precisará usar '' como há um espaço entre IIS e AppPool.

23
Balpreet Patil

A resposta acima não funcionou para mim porque o $_.privatekey retornou null. Consegui obter acesso à chave privada e atribuir permissões de 'Leitura' ao meu Pool de Aplicativos da seguinte maneira: 

param (
[string]$certStorePath  = "Cert:\LocalMachine\My",
[string]$AppPoolName,
[string]$certThumbprint
)

Import-Module WebAdministration

$certificate = Get-ChildItem $certStorePath | Where thumbprint -eq $certThumbprint

if ($certificate -eq $null)
{
    $message="Certificate with thumbprint:"+$certThumbprint+" does not exist at "+$certStorePath
    Write-Host $message -ForegroundColor Red
    exit 1;
}else
{
    $rsaCert = [System.Security.Cryptography.X509Certificates.RSACertificateExtensions]::GetRSAPrivateKey($certificate)
    $fileName = $rsaCert.key.UniqueName
    $path = "$env:ALLUSERSPROFILE\Microsoft\Crypto\Keys\$fileName"
    $permissions = Get-Acl -Path $path

    $access_rule = New-Object System.Security.AccessControl.FileSystemAccessRule("IIS AppPool\$AppPoolName", 'Read', 'None', 'None', 'Allow')
    $permissions.AddAccessRule($access_rule)
    Set-Acl -Path $path -AclObject $permissions
}
10
Michael Armitage

Como alternativa ao script acima. Você pode usar o módulo PowerShell. Eu não tentei eu mesmo, mas módulo parece ser bom. http://get-carbon.org/index.html

Aqui está o comando para definir permissões http://get-carbon.org/Grant-Permission.html

2
Balpreet Patil

Você pode usar WinHttpCertCfg.exe, uma Ferramenta de Configuração de Certificados Link: https://docs.Microsoft.com/pt-br/windows/desktop/winhttp/winhttpcertcfg-exe--a-configuration-certificate -tool

Algum exemplo de código:

Set privatekeyAcces to [email protected]
*.\WinHttpCertCfg.exe -g -c LOCAL_MACHINE\MY -s *.d365.mydomain.com  -a "[email protected]"*
1
Barreto