…ich weiß, ich weiß…
Hierzu gibt es schon eine ganze menge an Artikel im Internet. Viele sehr ausführlich und gut geschrieben.
Dieser wird kurz und Bündig.
Signatur-Zertifikat in Variable speichern:
$cert=(dir cert:currentuser\my\ -CodeSigningCert)
Der Inhalt der Variable sollte in etwa so sein:
Verzeichnis: Microsoft.PowerShell.Security\Certificate::currentuser\my Thumbprint Subject ---------- ------- D04A7B8DAE7E628CC828AAE0979B0B0D6E679D54 CN="Rasp, Robert", OU=Users, OU=PowerShell, DC=PowerShell, DC=pub
Script signieren:
Dazu wir ein Timestamp hinzugefügt, damit hinterlegt ist, dass das Zertifikat zum Zeitpunkt des Signierens gültig war. Das Script läuft dann auch noch nach Ablauf des Zertifikates!
Set-AuthenticodeSignature -Certificate $cert -IncludeChain all -TimestampServer http://timestamp.globalsign.com/scripts/timstamp.dll -FilePath .\Select-Test.ps1
Verzeichnis: D:\tmp SignerCertificate Status Path ----------------- ------ ---- D04A7B8DAE7E628CC828AAE0979B0B0D6E679D54 Valid Select-Test.ps1
Die Rückgabe ist auch gleich zu sehen….
Was passiert nun, wenn das Script verändert wird??!!
Vorher:
Get-AuthenticodeSignature -FilePath .\Select-Test.ps1 -Verbose | fl
SignerCertificate : [Subject] CN="Rasp, Robert", OU=Users, OU=PowerShell, DC=PowerShell, DC=pub [Issuer] CN=PowerShell-pub-CA, DC=PowerShell, DC=pub [Serial Number] 5F000000297E025D7E7EFC9B51000000000029 [Not Before] 17.03.2015 09:56:15 [Not After] 16.03.2016 09:56:15 [Thumbprint] D04A7B8DAE7E628CC828AAE0979B0B0D6E679D54 TimeStamperCertificate : [Subject] CN=GlobalSign TSA for MS Authenticode - G2, O=GMO GlobalSign Pte Ltd, C=SG [Issuer] CN=GlobalSign Timestamping CA - G2, O=GlobalSign nv-sa, C=BE [Serial Number] 112106A081D33FD87AE5824CC16B52094E03 [Not Before] 03.02.2015 01:00:00 [Not After] 03.03.2026 01:00:00 [Thumbprint] B36308B4D4CDED4FCFBD66B955FAE3BFB12C29E6 Status : Valid StatusMessage : Signatur wurde überprüft. Path : D:\tmp\Select-Test.ps1
Die dritte Zeile von unten ist ausschlaggebend: Valid
Nun habe ich ein Leerzeichen in einer Zeile hinzugefügt. (Syntaktisch keine Änderung)
Get-AuthenticodeSignature -FilePath .\Select-Test.ps1 -Verbose | fl
SignerCertificate : [Subject] CN="Rasp, Robert", OU=Users, OU=PowerShell, DC=PowerShell, DC=pub [Issuer] CN=PowerShell-pub-CA, DC=PowerShell, DC=pub [Serial Number] 5F000000297E025D7E7EFC9B51000000000029 [Not Before] 17.03.2015 09:56:15 [Not After] 16.03.2016 09:56:15 [Thumbprint] D04A7B8DAE7E628CC828AAE0979B0B0D6E679D54 TimeStamperCertificate : [Subject] CN=GlobalSign TSA for MS Authenticode - G2, O=GMO GlobalSign Pte Ltd, C=SG [Issuer] CN=GlobalSign Timestamping CA - G2, O=GlobalSign nv-sa, C=BE [Serial Number] 112106A081D33FD87AE5824CC16B52094E03 [Not Before] 03.02.2015 01:00:00 [Not After] 03.03.2026 01:00:00 [Thumbprint] B36308B4D4CDED4FCFBD66B955FAE3BFB12C29E6 Status : HashMismatch StatusMessage : Der Inhalt der Datei "D:\tmp\Select-Test.ps1" wurde möglicherweise von einem nicht autorisierten Benutzer oder Prozess manipuliert, da der Hash der Datei nicht mit dem in der digitalen Signatur gespeicherten Hash übereinstimmt. Das Skript wird auf dem angegebenen System nicht ausgeführt. Weitere Informationen erhalten Sie mit "Get-Help about_Signing". Path : D:\tmp\Select-Test.ps1
Der Status hat sich geändert! Wenn die Ausführungsrichtlinie entsprechend gesetzt ist, wird dieses Script nicht mehr ausgeführt.
Beim mir ist die Richtlinie auf „RemoteSigned“. Das Script würde weiterhin ausgeführt, da ein lokales Script keine Signatur benötigt!