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.
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.
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
}
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