Freigeben über


about_Signing

Kurze Beschreibung

Erläutert, wie Skripts signiert werden, damit sie den PowerShell-Ausführungsrichtlinien entsprechen.

Lange Beschreibung

Diese Informationen gelten nur für PowerShell, die unter Windows ausgeführt wird.

Die Richtlinie für die eingeschränkte Ausführung lässt keine Skripts ausführen. Die AllSigned - und RemoteSigned-Ausführungsrichtlinien verhindern, dass PowerShell Skripts ausführt, die nicht über eine digitale Signatur verfügen.

In diesem Thema wird erläutert, wie ausgewählte Skripts ausgeführt werden, die nicht signiert sind, auch wenn die Ausführungsrichtlinie RemoteSigned ist und wie Skripts für ihre eigene Verwendung signiert werden.

PowerShell überprüft die Authenticode-Signatur der folgenden Typtypen:

  • .ps1 Skriptdateien
  • .psm1 Moduldateien
  • .psd1 Modulmanifest und Datendateien
  • .ps1xml XML-Dateien eingeben und formatieren
  • .cdxml CDXML-Skriptdateien
  • .xaml XAML-Skriptdateien

Weitere Informationen zu PowerShell-Ausführungsrichtlinien finden Sie unter about_Execution_Policies.

So lassen Sie signierte Skripts zur Ausführung zu

Wenn Sie PowerShell zum ersten Mal auf einem Computer starten, wird wahrscheinlich die Richtlinie für die eingeschränkte Ausführung, die standard ist, wirksam sein.

Die Eingeschränkte Richtlinie erlaubt keine Ausführung von Skripts.

Um die effektive Ausführungsrichtlinie auf Ihrem Computer zu finden, geben Sie Folgendes ein:

Get-ExecutionPolicy

Um nicht signierte Skripts auszuführen, die Sie auf Ihrem lokalen Computer schreiben und von anderen Benutzern signierte Skripts signiert haben, starten Sie PowerShell mit der Option "Als Administrator ausführen", und verwenden Sie dann den folgenden Befehl, um die Ausführungsrichtlinie auf dem Computer in "RemoteSigned" zu ändern:

Set-ExecutionPolicy RemoteSigned

Weitere Informationen finden Sie im Hilfethema für das Set-ExecutionPolicy Cmdlet.

Ausführen nicht signierter Skripts mithilfe der RemoteSigned-Ausführungsrichtlinie

Wenn Ihre PowerShell-Ausführungsrichtlinie RemoteSigned ist, führt PowerShell keine nicht signierten Skripts aus, die aus dem Internet heruntergeladen werden, einschließlich nicht signierter Skripts, die Sie über E-Mail- und Chatprogramme erhalten.

Wenn Sie versuchen, ein heruntergeladenes Skript auszuführen, zeigt PowerShell die folgende Fehlermeldung an:

The file <file-name> cannot be loaded. The file <file-name> is not
digitally signed. The script will not execute on the system. Please see
"Get-Help about_Signing" for more details.

Bevor Sie das Skript ausführen, überprüfen Sie den Code, um sicherzustellen, dass Sie es vertrauen. Skripts haben dieselbe Wirkung wie jedes ausführbare Programm.

Verwenden Sie das Cmdlet, oder verwenden Sie das Unblock-File folgende Verfahren, um ein nicht signiertes Skript auszuführen.

  1. Speichern Sie die Skriptdatei auf Ihrem Computer.
  2. Klicken Sie auf "Start", klicken Sie auf "Arbeitsplatz", und suchen Sie die gespeicherte Skriptdatei.
  3. Klicken Sie mit der rechten Maustaste auf die Skriptdatei, und klicken Sie dann auf Eigenschaften.
  4. Klicken Sie auf Nicht mehr blockieren.

Wenn ein Skript, das aus dem Internet heruntergeladen wurde, digital signiert ist, Sie sich aber noch nicht dafür entschieden haben, dem Herausgeber zu vertrauen, zeigt PowerShell die folgende Meldung an:

Do you want to run software from this untrusted publisher?
The file <file-name> is published by CN=<publisher-name>. This
publisher is not trusted on your system. Only run scripts
from trusted publishers.

[V] Never run  [D] Do not run  [R] Run once  [A] Always run
[?] Help (default is "D"):

Wenn Sie dem Herausgeber vertrauen, wählen Sie "Einmal ausführen" oder "Immer ausführen" aus. Wenn Sie dem Herausgeber nicht vertrauen, wählen Sie entweder "Nie ausführen " oder "Nicht ausführen" aus. Wenn Sie "Nie ausführen" oder "Immer ausführen" auswählen, werden Sie von PowerShell nicht erneut zur Eingabe dieses Herausgebers aufgefordert.

Methoden des Signierens von Skripts

Sie können die skripts signieren, die Sie schreiben, und die Skripts, die Sie aus anderen Quellen erhalten. Bevor Sie ein Skript signieren, überprüfen Sie jeden Befehl, um zu überprüfen, ob es sicher ausgeführt werden kann.

Bewährte Methoden zum Signieren von Code finden Sie unter "Bewährte Methoden für die Codesignatur".

Weitere Informationen zum Signieren einer Skriptdatei finden Sie unter Set-AuthenticodeSignature.

Das New-SelfSignedCertificate cmdlet, das im PKI-Modul in PowerShell 3.0 eingeführt wurde, erstellt ein selbstsigniertes Zertifikat, das zum Testen geeignet ist. Weitere Informationen finden Sie im Hilfethema für das New-SelfSignedCertificate Cmdlet.

Um einem Skript eine digitale Signatur hinzuzufügen, müssen Sie sie mit einem Codesignaturzertifikat signieren. Zwei Arten von Zertifikaten eignen sich zum Signieren einer Skriptdatei:

  • Zertifikate, die von einer Zertifizierungsstelle erstellt werden: Für eine Gebühr überprüft eine öffentliche Zertifizierungsstelle Ihre Identität und gibt Ihnen ein Codesignaturzertifikat. Wenn Sie Ihr Zertifikat von einer seriösen Zertifizierungsstelle erwerben, können Sie Ihr Skript für Benutzer auf anderen Computern freigeben, auf denen Windows ausgeführt wird, da diese anderen Computer der Zertifizierungsstelle vertrauen.

  • Zertifikate, die Sie erstellen: Sie können ein selbstsigniertes Zertifikat erstellen, für das Ihr Computer die Autorität ist, die das Zertifikat erstellt. Dieses Zertifikat ist kostenlos und ermöglicht es Ihnen, Skripts auf Ihrem Computer zu schreiben, zu signieren und auszuführen. Ein Skript, das von einem selbstsignierten Zertifikat signiert ist, wird jedoch nicht auf anderen Computern ausgeführt.

In der Regel verwenden Sie ein selbstsigniertes Zertifikat nur zum Signieren von Skripts, die Sie für Ihre eigene Verwendung schreiben, und um Skripts zu signieren, die Sie von anderen Quellen erhalten, die Sie als sicher überprüft haben. Es ist nicht für Skripts geeignet, die auch innerhalb eines Unternehmens freigegeben werden.

Wenn Sie ein selbstsigniertes Zertifikat erstellen, müssen Sie unbedingt einen starken privaten Schlüsselschutz für Ihr Zertifikat aktivieren. Dadurch wird verhindert, dass bösartige Programme Skripts in Ihrem Auftrag signieren. Die Anweisungen sind am Ende dieses Themas enthalten.

Erstellen eines selbstsignierten Zertifikats

Verwenden Sie zum Erstellen eines selbstsignierten Zertifikats das Cmdlet New-SelfSignedCertificate im PKI-Modul. Dieses Modul wird in PowerShell 3.0 eingeführt. Weitere Informationen finden Sie im Hilfethema für das New-SelfSignedCertificate Cmdlet.

$params = @{
    Subject = 'CN=PowerShell Code Signing Cert'
    Type = 'CodeSigning'
    CertStoreLocation = 'Cert:\CurrentUser\My'
    HashAlgorithm = 'sha256'
}
$cert = New-SelfSignedCertificate @params

Verwenden von Makecert.exe

Um ein selbstsigniertes Zertifikat in früheren Versionen von Windows zu erstellen, verwenden Sie das Tool MakeCert.exezum Erstellen von Zertifikaten. Dieses Tool ist im Microsoft .NET SDK (Version 1.1 und höher) und im Microsoft Windows SDK enthalten.

Weitere Informationen zur Syntax und den Parameterbeschreibungen des MakeCert.exe Tools finden Sie unter Zertifikaterstellungstool (MakeCert.exe).

Um das MakeCert.exe Tool zum Erstellen eines Zertifikats zu verwenden, führen Sie die folgenden Befehle in einem SDK-Eingabeaufforderungsfenster aus.

Hinweis

Der erste Befehl erstellt eine lokale Zertifizierungsstelle für Ihren Computer. Der zweite Befehl generiert ein persönliches Zertifikat von der Zertifizierungsstelle. Sie können die Befehle genauso kopieren oder eingeben, wie sie angezeigt werden. Es sind keine Ersetzungen erforderlich, obwohl Sie den Zertifikatnamen ändern können.

makecert -n "CN=PowerShell Local Certificate Root" -a sha256 `
-eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer `
-ss Root -sr localMachine

makecert -pe -n "CN=PowerShell User" -ss MY -a sha256 `
-eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer

Das MakeCert.exe Tool fordert Sie auf, ein Kennwort für privaten Schlüssel einzugeben. Das Kennwort stellt sicher, dass niemand das Zertifikat ohne Ihre Zustimmung verwenden oder darauf zugreifen kann. Erstellen Sie ein Kennwort, das Sie sich merken können, und geben Sie es ein. Sie verwenden dieses Kennwort später, um das Zertifikat abzurufen.

Um zu überprüfen, ob das Zertifikat ordnungsgemäß generiert wurde, verwenden Sie den folgenden Befehl, um das Zertifikat im Zertifikatspeicher auf dem Computer abzurufen. Sie finden keine Zertifikatdatei im Dateisystemverzeichnis.

Geben Sie an der PowerShell-Eingabeaufforderung Folgendes ein:

Get-ChildItem cert:\CurrentUser\my -codesigning

Dieser Befehl verwendet den PowerShell-Zertifikatanbieter, um Informationen zum Zertifikat anzuzeigen.

Wenn das Zertifikat erstellt wurde, zeigt die Ausgabe den Fingerabdruck an, der das Zertifikat in einer Anzeige identifiziert, die wie folgt aussieht:

Directory: Microsoft.PowerShell.Security\Certificate::CurrentUser\My

Thumbprint                                Subject
----------                                -------
4D4917CB140714BA5B81B96E0B18AAF2C4564FDF  CN=PowerShell User ]

Signieren eines Skripts

Nachdem Sie ein selbstsigniertes Zertifikat erstellt haben, können Sie Skripts signieren. Wenn Sie die AllSigned-Ausführungsrichtlinie verwenden, können Sie mit dem Signieren eines Skripts das Skript auf Ihrem Computer ausführen.

Das folgende Beispielskript Add-Signature.ps1signiert ein Skript. Wenn Sie jedoch die AllSigned-Ausführungsrichtlinie verwenden, müssen Sie das Add-Signature.ps1 Skript signieren, bevor Sie es ausführen.

Wichtig

Vor PowerShell 7.2 muss das Skript mit ASCII- oder UTF8NoBOM-Codierung gespeichert werden. PowerShell 7.2 und höher unterstützt signierte Skripts für jedes beliebige Codierungsformat.

Um dieses Skript zu verwenden, kopieren Sie den folgenden Text in eine Textdatei, und nennen Sie es Add-Signature.ps1.

## Signs a file
[cmdletbinding()]
param(
    [Parameter(Mandatory=$true)]
    [string] $File
)

$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert |
    Select-Object -First 1

Set-AuthenticodeSignature -FilePath $File -Certificate $cert

Geben Sie zum Signieren der Add-Signature.ps1 Skriptdatei die folgenden Befehle an der PowerShell-Eingabeaufforderung ein:

$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert |
    Select-Object -First 1

Set-AuthenticodeSignature add-signature.ps1 $cert

Nachdem Sie das Skript signiert haben, können Sie es auf dem lokalen Computer ausführen. Das Skript wird jedoch nicht auf Computern ausgeführt, auf denen die PowerShell-Ausführungsrichtlinie eine digitale Signatur von einer vertrauenswürdigen Autorität erfordert. Wenn Sie versuchen, zeigt PowerShell die folgende Fehlermeldung an:

The file C:\remote_file.ps1 cannot be loaded. The signature of the
certificate cannot be verified.
At line:1 char:15
+ .\ remote_file.ps1 <<<<

Wenn PowerShell diese Meldung anzeigt, wenn Sie ein Skript ausführen, das Sie nicht geschrieben haben, behandeln Sie die Datei wie jedes nicht signierte Skript. Überprüfen Sie den Code, um zu ermitteln, ob Sie dem Skript vertrauen können.

Aktivieren eines starken Schutzes für Ihren privaten Schlüssel

Wenn Sie über einen privaten Schlüssel und ein Zertifikat auf Ihrem Computer verfügen, können bösartige Programme möglicherweise Skripts in Ihrem Auftrag signieren, wodurch PowerShell zum Ausführen autorisiert wird.

Um die automatisierte Anmeldung in Ihrem Auftrag zu verhindern, verwenden Sie den Zertifikat-Manager Certmgr.exe , um Ihren Signaturschlüssel und das Zertifikat in eine .pfx Datei zu exportieren. Der Zertifikat-Manager ist im Microsoft .NET SDK, im Microsoft Windows SDK und in Internet Explorer enthalten.

So exportieren Sie das Zertifikat:

  1. Starten Sie den Zertifikat-Manager.
  2. Wählen Sie das Zertifikat aus, das vom lokalen PowerShell-Zertifikatstamm ausgestellt wurde.
  3. Klicken Sie auf "Exportieren ", um den Zertifikatexport-Assistenten zu starten.
  4. Wählen Sie Ja, privaten Schlüssel exportieren aus, und klicken Sie dann auf Weiter.
  5. Wählen Sie "Starken Schutz aktivieren" aus.
  6. Geben Sie ein Kennwort ein, und geben Sie es erneut ein, um es zu bestätigen.
  7. Geben Sie einen Dateinamen mit der .pfx Dateinamenerweiterung ein.
  8. Klicken Sie auf Fertig stellen.

So importieren Sie das Zertifikat erneut:

  1. Starten Sie den Zertifikat-Manager.
  2. Klicken Sie auf "Importieren ", um den Zertifikatimport-Assistenten zu starten.
  3. Öffnen Sie den Speicherort der .pfx Datei, die Sie während des Exportvorgangs erstellt haben.
  4. Wählen Sie auf der Seite "Kennwort" die Option "Schutz sicherer privater Schlüssel aktivieren" aus, und geben Sie dann das Kennwort ein, das Sie während des Exportvorgangs zugewiesen haben.
  5. Wählen Sie den Zertifikatspeicher Persönlich aus.
  6. Klicken Sie auf Fertig stellen.

Verhindern, dass die Signatur abläuft

Die digitale Signatur in einem Skript ist gültig, bis das Signaturzertifikat abläuft oder solange ein Zeitstempelserver überprüfen kann, ob das Skript signiert wurde, während das Signaturzertifikat gültig war.

Da die meisten Signaturzertifikate nur ein Jahr gültig sind, stellt die Verwendung eines Zeitstempelservers sicher, dass Benutzer Ihr Skript für viele Jahre verwenden können.

Siehe auch