Udostępnij za pośrednictwem


about_Signing

Krótki opis

Objaśnienie sposobu podpisywania skryptów w taki sposób, aby były zgodne z zasadami wykonywania programu PowerShell.

Długi opis

Te informacje dotyczą tylko programu PowerShell uruchomionego w systemie Windows.

Zasady wykonywania z ograniczeniami nie zezwalają na uruchamianie żadnych skryptów. Zasady wykonywania AllSigned i RemoteSigned uniemożliwiają programowi PowerShell uruchamianie skryptów, które nie mają podpisu cyfrowego.

W tym temacie wyjaśniono, jak uruchamiać wybrane skrypty, które nie są podpisane, nawet jeśli zasady wykonywania są remoteSigned i jak podpisywać skrypty do własnego użytku.

Program PowerShell sprawdza podpis Authenticode następujących typów:

  • .ps1 pliki skryptów
  • .psm1 pliki modułu
  • .psd1 manifest modułu i pliki danych
  • .ps1xml typ i formatowanie plików XML
  • .cdxml Pliki skryptów CDXML
  • .xaml Pliki skryptów XAML

Aby uzyskać więcej informacji na temat zasad wykonywania programu PowerShell, zobacz about_Execution_Policies.

Aby zezwolić na uruchamianie podpisanych skryptów

Po pierwszym uruchomieniu programu PowerShell na komputerze zasady wykonywania z ograniczeniami , które są domyślne, prawdopodobnie będą obowiązywać.

Zasady z ograniczeniami nie zezwalają na uruchamianie żadnych skryptów.

Aby znaleźć obowiązujące zasady wykonywania na komputerze, wpisz:

Get-ExecutionPolicy

Aby uruchomić niepodpisane skrypty zapisywane na komputerze lokalnym i podpisane skrypty od innych użytkowników, uruchom program PowerShell z opcją Uruchom jako administrator , a następnie użyj następującego polecenia, aby zmienić zasady wykonywania na komputerze na RemoteSigned:

Set-ExecutionPolicy RemoteSigned

Aby uzyskać więcej informacji, zobacz temat pomocy dla Set-ExecutionPolicy polecenia cmdlet.

Uruchamianie niepodpisanych skryptów przy użyciu zasad wykonywania RemoteSigned

Jeśli zasady wykonywania programu PowerShell są remoteSigned, program PowerShell nie będzie uruchamiał niepodpisanych skryptów pobranych z Internetu, w tym niepodpisanych skryptów otrzymywanych za pośrednictwem poczty e-mail i programów do obsługi wiadomości błyskawicznych.

Jeśli spróbujesz uruchomić pobrany skrypt, program PowerShell wyświetli następujący komunikat o błędzie:

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.

Przed uruchomieniem skryptu przejrzyj kod, aby upewnić się, że jest on zaufany. Skrypty mają taki sam efekt jak każdy program wykonywalny.

Aby uruchomić niepodpisany skrypt, użyj Unblock-File polecenia cmdlet lub użyj poniższej procedury.

  1. Zapisz plik skryptu na komputerze.
  2. Kliknij przycisk Start, kliknij pozycję Mój komputer i znajdź zapisany plik skryptu.
  3. Kliknij prawym przyciskiem myszy plik skryptu, a następnie kliknij polecenie Właściwości.
  4. Kliknij przycisk Odblokuj.

Jeśli skrypt pobrany z Internetu jest podpisany cyfrowo, ale nie wybrano jeszcze zaufania wydawcy, program PowerShell wyświetla następujący komunikat:

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"):

Jeśli ufasz wydawcy, wybierz pozycję Uruchom raz lub Zawsze uruchom. Jeśli nie ufasz wydawcy, wybierz pozycję Nigdy nie uruchamiaj lub Nie uruchamiaj. Jeśli wybierzesz opcję Nigdy nie uruchamiaj lub Zawsze uruchamiasz, program PowerShell nie wyświetli ponownie monitu dla tego wydawcy.

Metody podpisywania skryptów

Możesz podpisać skrypty, które piszesz, oraz skrypty, które otrzymujesz z innych źródeł. Przed podpisaniem dowolnego skryptu sprawdź każde polecenie, aby sprawdzić, czy uruchamianie jest bezpieczne.

Aby uzyskać najlepsze rozwiązania dotyczące podpisywania kodu, zobacz Najlepsze rozwiązania dotyczące podpisywania kodu.

Aby uzyskać więcej informacji na temat podpisywania pliku skryptu, zobacz Set-AuthenticodeSignature.

Polecenie New-SelfSignedCertificate cmdlet wprowadzone w module PKI w programie PowerShell 3.0 tworzy certyfikat z podpisem własnym, który jest odpowiedni do testowania. Aby uzyskać więcej informacji, zobacz temat pomocy dla New-SelfSignedCertificate polecenia cmdlet.

Aby dodać podpis cyfrowy do skryptu, należy go podpisać przy użyciu certyfikatu podpisywania kodu. Dwa typy certyfikatów są odpowiednie do podpisywania pliku skryptu:

  • Certyfikaty tworzone przez urząd certyfikacji: Za opłatę publiczny urząd certyfikacji weryfikuje Twoją tożsamość i nadaje certyfikat podpisywania kodu. Po zakupie certyfikatu od zaufanego urzędu certyfikacji możesz udostępnić skrypt użytkownikom na innych komputerach z systemem Windows, ponieważ te inne komputery ufają urzędowi certyfikacji.

  • Utworzone certyfikaty: możesz utworzyć certyfikat z podpisem własnym, dla którego komputer jest urzędem tworzącym certyfikat. Ten certyfikat jest bezpłatny i umożliwia pisanie, podpisywanie i uruchamianie skryptów na komputerze. Jednak skrypt podpisany przez certyfikat z podpisem własnym nie będzie uruchamiany na innych komputerach.

Zazwyczaj certyfikat z podpisem własnym jest używany tylko do podpisywania skryptów, które są pisane do własnego użycia, oraz do podpisywania skryptów uzyskanych z innych źródeł, które zostały zweryfikowane jako bezpieczne. Nie jest to odpowiednie w przypadku skryptów, które będą udostępniane nawet w przedsiębiorstwie.

Jeśli tworzysz certyfikat z podpisem własnym, pamiętaj, aby włączyć silną ochronę klucza prywatnego w certyfikacie. Zapobiega to podpisywaniu skryptów przez złośliwe programy w Twoim imieniu. Instrukcje znajdują się na końcu tego tematu.

Tworzenie certyfikatu z podpisem własnym

Aby utworzyć certyfikat z podpisem własnym, użyj polecenia cmdlet New-SelfSignedCertificate w module PKI. Ten moduł został wprowadzony w programie PowerShell 3.0. Aby uzyskać więcej informacji, zobacz temat pomocy dla New-SelfSignedCertificate polecenia cmdlet.

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

Korzystanie z Makecert.exe

Aby utworzyć certyfikat z podpisem własnym we wcześniejszych wersjach systemu Windows, użyj narzędzia MakeCert.exedo tworzenia certyfikatów. To narzędzie jest dołączone do zestawu Microsoft .NET SDK (wersja 1.1 lub nowsza) oraz zestawu Microsoft Windows SDK.

Aby uzyskać więcej informacji na temat składni i opisów parametrów MakeCert.exe narzędzia, zobacz Narzędzie do tworzenia certyfikatów (MakeCert.exe).

Aby użyć MakeCert.exe narzędzia do utworzenia certyfikatu, uruchom następujące polecenia w oknie wiersza polecenia zestawu SDK.

Uwaga

Pierwsze polecenie tworzy lokalny urząd certyfikacji dla komputera. Drugie polecenie generuje osobisty certyfikat z urzędu certyfikacji. Możesz skopiować lub wpisać polecenia dokładnie tak, jak są wyświetlane. Nie są konieczne podstawianie, chociaż można zmienić nazwę certyfikatu.

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

Narzędzie MakeCert.exe wyświetla monit o podanie hasła klucza prywatnego. Hasło gwarantuje, że nikt nie będzie mógł korzystać z certyfikatu ani uzyskiwać do niego dostępu bez twojej zgody. Utwórz i wprowadź hasło, które możesz zapamiętać. Użyjesz tego hasła później, aby pobrać certyfikat.

Aby sprawdzić, czy certyfikat został wygenerowany poprawnie, użyj następującego polecenia, aby pobrać certyfikat w magazynie certyfikatów na komputerze. Nie znajdziesz pliku certyfikatu w katalogu systemu plików.

W wierszu polecenia programu PowerShell wpisz:

Get-ChildItem cert:\CurrentUser\my -codesigning

To polecenie używa dostawcy certyfikatów programu PowerShell do wyświetlania informacji o certyfikacie.

Jeśli certyfikat został utworzony, dane wyjściowe zawierają odcisk palca, który identyfikuje certyfikat w wyświetlaczu podobnym do następującego:

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

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

Podpisywanie skryptu

Po utworzeniu certyfikatu z podpisem własnym możesz podpisać skrypty. Jeśli używasz zasad wykonywania AllSigned , podpisywanie skryptu umożliwia uruchomienie skryptu na komputerze.

Poniższy przykładowy skrypt , Add-Signature.ps1podpisuje skrypt. Jeśli jednak używasz zasad wykonywania AllSigned , przed jego uruchomieniem musisz podpisać Add-Signature.ps1 skrypt.

Ważne

Przed programem PowerShell 7.2 skrypt musi zostać zapisany przy użyciu kodowania ASCII lub UTF8NoBOM. Program PowerShell 7.2 lub nowszy obsługuje podpisane skrypty dla dowolnego formatu kodowania.

Aby użyć tego skryptu, skopiuj następujący tekst do pliku tekstowego i nadaj mu Add-Signature.ps1nazwę .

## 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

Aby podpisać plik skryptu Add-Signature.ps1 , wpisz następujące polecenia w wierszu polecenia programu PowerShell:

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

Set-AuthenticodeSignature add-signature.ps1 $cert

Po podpisaniu skryptu można go uruchomić na komputerze lokalnym. Skrypt nie będzie jednak uruchamiany na komputerach, na których zasady wykonywania programu PowerShell wymagają podpisu cyfrowego od zaufanego urzędu. Jeśli spróbujesz, program PowerShell wyświetli następujący komunikat o błędzie:

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

Jeśli program PowerShell wyświetla ten komunikat po uruchomieniu skryptu, który nie został napisany, traktuj plik tak, jak w przypadku skryptu bez znaku. Przejrzyj kod, aby określić, czy możesz ufać skryptowi.

Włączanie silnej ochrony klucza prywatnego

Jeśli masz klucz prywatny i certyfikat na komputerze, złośliwe programy mogą być w stanie podpisać skrypty w Twoim imieniu, co autoryzuje program PowerShell do ich uruchamiania.

Aby zapobiec automatycznemu podpisywaniu w Twoim imieniu, użyj Menedżera Certmgr.exe certyfikatów, aby wyeksportować klucz podpisywania i certyfikat do .pfx pliku. Menedżer certyfikatów jest dołączony do zestawu Microsoft .NET SDK, zestawu Microsoft Windows SDK i programu Internet Explorer.

Aby wyeksportować certyfikat:

  1. Uruchom Menedżera certyfikatów.
  2. Wybierz certyfikat wystawiony przez katalog główny certyfikatu lokalnego programu PowerShell.
  3. Kliknij przycisk Eksportuj , aby uruchomić Kreatora eksportu certyfikatów.
  4. Wybierz pozycję Tak, wyeksportuj klucz prywatny, a następnie kliknij przycisk Dalej.
  5. Wybierz pozycję Włącz silną ochronę.
  6. Wpisz hasło, a następnie wpisz je ponownie, aby potwierdzić.
  7. Wpisz nazwę pliku z .pfx rozszerzeniem nazwy pliku.
  8. Kliknij przycisk Zakończ.

Aby ponownie zaimportować certyfikat:

  1. Uruchom Menedżera certyfikatów.
  2. Kliknij przycisk Importuj , aby uruchomić Kreatora importu certyfikatów.
  3. Otwórz plik w lokalizacji pliku utworzonego .pfx podczas procesu eksportowania.
  4. Na stronie Hasło wybierz pozycję Włącz silną ochronę klucza prywatnego, a następnie wprowadź hasło przypisane podczas procesu eksportowania.
  5. Wybierz osobisty magazyn certyfikatów.
  6. Kliknij przycisk Zakończ.

Zapobieganie wygaśnięciu podpisu

Podpis cyfrowy skryptu jest ważny do momentu wygaśnięcia certyfikatu podpisywania lub tak długo, jak serwer sygnatury czasowej może sprawdzić, czy skrypt został podpisany, gdy certyfikat podpisywania był prawidłowy.

Ponieważ większość certyfikatów podpisywania jest ważna tylko przez jeden rok, użycie serwera sygnatury czasowej gwarantuje, że użytkownicy mogą używać skryptu przez wiele lat.

Zobacz też