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
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.
- Zapisz plik skryptu na komputerze.
- Kliknij przycisk Start, kliknij pozycję Mój komputer i znajdź zapisany plik skryptu.
- Kliknij prawym przyciskiem myszy plik skryptu, a następnie kliknij polecenie Właściwości.
- 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.exe
do 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.ps1
podpisuje skrypt. Jeśli jednak używasz zasad wykonywania AllSigned , przed jego uruchomieniem musisz podpisać Add-Signature.ps1
skrypt.
Ważne
Skrypt należy zapisać przy użyciu kodowania ASCII lub UTF8NoBOM. Możesz podpisać plik skryptu, który używa innego kodowania, ale nie można uruchomić skryptu lub nie można zaimportować modułu zawierającego skrypt. Skrypt zakończy się również niepowodzeniem, jeśli plik zawiera znaki Unicode (UTF8).
Aby użyć tego skryptu, skopiuj następujący tekst do pliku tekstowego i nadaj mu Add-Signature.ps1
nazwę .
## 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:
- Uruchom Menedżera certyfikatów.
- Wybierz certyfikat wystawiony przez katalog główny certyfikatu lokalnego programu PowerShell.
- Kliknij przycisk Eksportuj , aby uruchomić Kreatora eksportu certyfikatów.
- Wybierz pozycję Tak, wyeksportuj klucz prywatny, a następnie kliknij przycisk Dalej.
- Wybierz pozycję Włącz silną ochronę.
- Wpisz hasło, a następnie wpisz je ponownie, aby potwierdzić.
- Wpisz nazwę pliku z
.pfx
rozszerzeniem nazwy pliku. - Kliknij przycisk Zakończ.
Aby ponownie zaimportować certyfikat:
- Uruchom Menedżera certyfikatów.
- Kliknij przycisk Importuj , aby uruchomić Kreatora importu certyfikatów.
- Otwórz plik w lokalizacji pliku utworzonego
.pfx
podczas procesu eksportowania. - Na stronie Hasło wybierz pozycję Włącz silną ochronę klucza prywatnego, a następnie wprowadź hasło przypisane podczas procesu eksportowania.
- Wybierz osobisty magazyn certyfikatów.
- 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.