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 eingeschränkte Ausführung lässt die Ausführung von Skripts nicht zu. Die Ausführungsrichtlinien AllSigned und RemoteSigned verhindern, dass PowerShell Skripts ohne digitale Signatur ausführt.

In diesem Thema wird erläutert, wie Sie ausgewählte Skripts ausführen, die nicht signiert sind, auch wenn die Ausführungsrichtlinie RemoteSigned ist, und wie Sie Skripts für Ihre eigene Verwendung signieren.

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

So lassen Sie die Ausführung signierter Skripts zu

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

Die Eingeschränkte Richtlinie lässt die Ausführung von Skripts nicht zu.

Geben Sie Folgendes ein, um die effektive Ausführungsrichtlinie auf Ihrem Computer zu finden:

Get-ExecutionPolicy

Um nicht signierte Skripts auszuführen, die Sie auf Ihrem lokalen Computer schreiben, und signierte Skripts von anderen Benutzern, 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 zum Set-ExecutionPolicy Cmdlet.

Ausführen von nicht signierten 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 Instant Messaging-Programme 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 dem Skript vertrauen. Skripts haben die gleiche Wirkung wie jedes ausführbare Programm.

Verwenden Sie zum Ausführen eines nicht signierten Skripts das Cmdlet Unblock-File oder das folgende Verfahren.

  1. Speichern Sie die Skriptdatei auf Ihrem Computer.
  2. Klicken Sie auf Start, 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 blocken.

Wenn ein aus dem Internet heruntergeladenes Skript digital signiert ist, Sie sich aber noch nicht für das Vertrauen des Herausgebers entschieden haben, 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 zum Signieren von Skripts

Sie können die Skripts, die Sie schreiben, und die Skripts signieren, die Sie aus anderen Quellen beziehen. Überprüfen Sie vor dem Signieren eines Skripts jeden Befehl, um zu überprüfen, ob die Ausführung sicher ist.

Bewährte Methoden zur Codesignatur 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 für Tests geeignet ist. Weitere Informationen finden Sie im Hilfethema zum Cmdlet New-SelfSignedCertificate.

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

  • Zertifikate, die von einer Zertifizierungsstelle erstellt werden: Gegen eine Gebühr überprüft eine öffentliche Zertifizierungsstelle Ihre Identität und stellt Ihnen ein Zertifikat für die Codesignierung zur Signatur bereit. 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.

  • Von Ihnen erstellte Zertifikate: 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 Ihnen das Schreiben, Signieren und Ausführen von Skripts auf Ihrem Computer. 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 zum Signieren von Skripts, die Sie von anderen Quellen erhalten, die Sie als sicher überprüft haben. Es eignet sich nicht für Skripts, die freigegeben werden, auch nicht innerhalb eines Unternehmens.

Wenn Sie ein selbstsigniertes Zertifikat erstellen, stellen Sie sicher, dass Sie einen starken Schutz für private Schlüssel für Ihr Zertifikat aktivieren. Dadurch wird verhindert, dass schädliche Programme Skripts in Ihrem Namen signieren. Die Anweisungen finden Sie am Ende dieses Themas.

Erstellen eines selbstsignierten Zertifikats

Verwenden Sie zum Erstellen eines selbstsignierten Zertifikats das Cmdlet New-SelfSignedCertificate im PKI-Modul . Dieses Modul wurde in PowerShell 3.0 eingeführt und ist in Windows 8 und Windows Server 2012 enthalten. Weitere Informationen finden Sie im Hilfethema zum 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 zum MakeCert.exeErstellen von Zertifikaten. Dieses Tool ist im Microsoft .NET SDK (Versionen 1.1 und höher) und im Microsoft Windows SDK enthalten.

Weitere Informationen zur Syntax und zu 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

Mit dem ersten Befehl wird eine lokale Zertifizierungsstelle für Ihren Computer erstellt. Der zweite Befehl generiert ein persönliches Zertifikat von der Zertifizierungsstelle. Sie können die Befehle genau so 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 zur Eingabe eines Kennworts für den privaten Schlüssel auf. 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 das Skript beim Signieren eines Skripts auf Ihrem Computer ausführen.

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

Wichtig

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

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

## Signs a file
param([string] $file=$(throw "Please specify a filename."))
$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
Set-AuthenticodeSignature $file $cert

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

$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
Set-AuthenticodeSignature add-signature.ps1 $cert

Nachdem das Skript signiert wurde, 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öswillige Programme möglicherweise Skripts in Ihrem Namen signieren, sodass PowerShell diese ausführen kann.

Um die automatisierte Signatur in Ihrem Namen zu verhindern, exportieren Sie den Signaturschlüssel und das Zertifikat mithilfe des Zertifikat-Managers Certmgr.exe in eine .pfx Datei. 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 Zertifikatstamm von PowerShell 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 zur Bestätigung erneut ein.
  7. Geben Sie einen Dateinamen mit der Dateinamenerweiterung PFX 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 für starken privaten 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 des Ablaufs der Signatur

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 lang gültig sind, stellt die Verwendung eines Zeitstempelservers sicher, dass Benutzer Ihr Skript für viele Jahre verwenden können.

Weitere Informationen