2

Zertifikat Berechtigungen ändern mit PowerShell

Zertifikate sind in der heutigen Zeit nicht mehr wegzudenken. In Windows gibt es Benutzerzertifikate und Computerzertifikate. Diese werden im Zertifikats Store abgelegt. Wie im Dateisystem gibt es bei Zertifikaten ebenfalls Berechtigungen, die gesetzt werden können. Man kann die Zertifikat Berechtigungen ändern mit PowerShell.

Tumisu / Pixabay

 

Problem mit der Zertifikat Berechtigung

In meinem Fall war es so, dass ein IPsec Zertifikat für eine VPN Verbindung in den Computerzertifikaten hinterlegt war.

Wenn mein Benutzer vor der Windows Anmeldung eine IPsec Verbindung aufbauen möchte, klappt das ohne Probleme, da das Systemkonto Zugriff auf das Computerzertifikat besitzt.

Wenn nun der Benutzer sich vor der Anmeldung nicht verbindet, sondern sich ganz “normal” am Computer anmeldet wird erstmal das Zertifikat nicht benötigt. Dockt er nun seinen Laptop aus der Docking Station, und möchte dann eine VPN Verbindung aufbauen, hat der User leider keine Leserechte auf das Zertifikat.

Da es im Unternehmen sehr viele Clients sind, kann man nicht bei jedem Benutzer “händisch” die Berechtigungen setzen. Somit müssen wir bei der Softwareverteilung die Zertifikat Berechtigungen ändern mit PowerShell.

Zertifikat Berechtigung ändern Console

 

Zertifikat Berechtigungen ändern mit PowerShell

Damit nun der “normale” Benutzer auch Lese Zugriff auf das Zertifikat bekommt, ist nur ein kleines PowerShell Script notwendig. Es gibt allerdings noch ein kleines Problem. Man könnte nun natürlich den Benutzer Berechtigen. Aber was passiert wenn sich ein anderer User am Notebook / Tablet anmeldet? Dann funktioniert es schon wieder nicht. Der Trick ist nun, dass nicht einzelne User berechtigt werden, sondern gleich die AD Gruppe “Domänen-Benutzer“. Somit ist es egal welcher Benutzer sich anmeldet.

In vielen Beiträgen wird geschrieben, dass man “nur” die Berechtigungen auf Dateiebene (“C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys“) verändern muss. Bei mir war das allerdings NICHT ausreichend. Damit das anständig bei mir klappt, muss ebenfalls noch die Berechtigung im Zertifikat Store verändert werden.

<#
.SYNOPSIS
  Zertifikat Berechtigungen setzen
.DESCRIPTION
  Setzt die Berechtigung auf Zertifikate im Dateisystem und im Cert Store
.NOTES
  Version:        1.0
  Author:         www.ITnator.net | Johannes Huber
  Creation Date:  08.05.2019
.EXAMPLE
#>


################################################  global variable

# set SID of 'Domain-Users'
$SID = New-Object System.Security.Principal.SecurityIdentifier "S-1-5-21-2660505080-1968363269-2955978487-513"

# set cert thumbprint
$thumbprint = '1E5B33D6A2A1650XXXXXXXXXX5626BXXXXXXXXXX'



################################################  set FileSystem Permissions
# get cert key name
$keyName=(((Get-ChildItem Cert:\LocalMachine\My | Where-Object {$_.Thumbprint -like $Thumbprint}).PrivateKey).CspKeyContainerInfo).UniqueKeyContainerName

# set cert file system directory
$keyPath = "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\"

# set full path
$fullPath=$keyPath+$keyName

# get current permissions
$acl=Get-Acl -Path $fullPath

# define read permissions
$permission=$SID,"Read","Allow"

# define new access rule
$accessRuleFileSystem=new-object System.Security.AccessControl.FileSystemAccessRule $permission

# set new access rule
$acl.AddAccessRule($accessRuleFileSystem)

# activate new access rule
Set-Acl $fullPath $acl



################################################  set CryptoKey Permissions
# set AccessRule 
$AccessRuleCryptoKey = New-Object System.Security.AccessControl.CryptoKeyAccessRule($SID, 'GenericRead', 'Allow')

# open cert store as read/write
$store = New-Object System.Security.Cryptography.X509Certificates.X509Store("My","LocalMachine")
$store.Open("ReadWrite")
# check cert is in store
$RWcert = $store.Certificates | where {$_.Thumbprint -eq $thumbprint}

# set new CSP parameter object based on certificate provider and key name
$csp = New-Object System.Security.Cryptography.CspParameters($RWcert.PrivateKey.CspKeyContainerInfo.ProviderType, $RWcert.PrivateKey.CspKeyContainerInfo.ProviderName, $RWcert.PrivateKey.CspKeyContainerInfo.KeyContainerName)

# set flags and key security
$csp.Flags = "UseExistingKey","UseMachineKeyStore"
$csp.CryptoKeySecurity = $RWcert.PrivateKey.CspKeyContainerInfo.CryptoKeySecurity
$csp.KeyNumber = $RWcert.PrivateKey.CspKeyContainerInfo.KeyNumber

# add access rule to CSP object
$csp.CryptoKeySecurity.AddAccessRule($AccessRuleCryptoKey)

# create new CryptoServiceProvider object
$rsa2 = New-Object System.Security.Cryptography.RSACryptoServiceProvider($csp)

# close certificate store
$store.Close()

(Dieses PowerShell Script sollte nach der Installation der VPN Software, oder generell per Softwareverteilung ausgeführt werden.)

Nach dem Ausführen des PowerShell Scripts, sollten die Domain Users die Leseberechtigung auf die Zertifikate besitzen.

Zertifikat Berechtigung ändern mit PowerShell

 

Ich hoffe wir konnten euch zum Thema “Zertifikat Berechtigungen ändern mit PowerShell” weiterhelfen und das verständlich erklären. 🙂

Johannes Huber
 

In seiner Freizeit macht Johannes nichts lieber, als für ITnator Beiträge zu schreiben. Input bekommt er hierfür von Problemen in der IT Administration von Servern, Clients und vielen weiteren IT Komponenten.

Click Here to Leave a Comment Below 2 comments
sidebar