web-dev-qa-db-fra.com

Comment accorder une autorisation à un utilisateur sur une clé privée de certificat à l'aide de powershell?

Le certificat est déjà installé sur la machine. Maintenant, je veux donner à l'utilisateur de l'application le droit de lecture sur PrivateKey of Certificate.

14
Balpreet Patil

Voici la réponse.

Création d'un fichier de script Powershell AddUserToCertificate.ps1

Voici le contenu du fichier 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

Maintenant, lancez-le dans le cadre du déploiement. Exemple d’exécution du script ci-dessus dans la fenêtre de la console Powershell. 

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

cet exemple donne le certificat read à l'utilisateur testuser1 on qui est installé dans\LocalMachine\My et a l'empreinte numérique 1fb7603985a8a11d3e85abee194697e9784a253

Si vous utilisez ApplicationPoolIdentity, votre nom d'utilisateur sera 'IIS AppPool\AppPoolNameHere'

Remarque : Vous devrez utiliser '' car il y a un espace entre IIS et AppPool.

23
Balpreet Patil

La réponse ci-dessus n'a pas fonctionné pour moi car le $_.privatekey a renvoyé la valeur null. J'ai réussi à obtenir l'accès à la clé privée et à attribuer les autorisations «Lecture» pour mon pool d'applications comme suit: 

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

En alternative au script ci-dessus. Vous pouvez utiliser le module PowerShell. Je n'ai pas essayé moi-même, mais le module a bonne apparence . http://get-carbon.org/index.html

Voici la commande pour définir les autorisations http://get-carbon.org/Grant-Permission.html

2
Balpreet Patil