o_podpisywaniu

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 ograniczonego wykonywania 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 to RemoteSigned, oraz jak podpisywać skrypty na własny użytek.

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

Aby zezwolić na uruchamianie podpisanych skryptów

Po uruchomieniu programu PowerShell na komputerze po raz pierwszy zasady ograniczonego wykonywania (ustawienie domyślne) prawdopodobnie będą obowiązywać.

Zasada Ograniczone nie zezwala na uruchamianie żadnych skryptów.

Aby znaleźć efektywną politykę wykonywania na komputerze, wpisz:

Get-ExecutionPolicy

Aby uruchomić niepodpisane skrypty pisane 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 dotyczący cmdletu Set-ExecutionPolicy.

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

Jeśli zasady wykonywania programu PowerShell to 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 mu ufasz. Skrypty mają taki sam efekt jak każdy program wykonywalny.

Aby uruchomić niepodpisany skrypt, użyj polecenia cmdlet Unblock-File lub wykonaj poniższą procedurę.

  1. Zapisz plik skryptu na komputerze.
  2. Kliknij przycisk Start, kliknij polecenie 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 Odblokuj.

Jeśli skrypt, który został pobrany z Internetu, jest podpisany cyfrowo, ale nie wybrano jeszcze opcji zaufania jego 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 opcję "Uruchom raz" lub "Zawsze uruchamiaj". Jeśli nie ufasz wydawcy, wybierz opcję "Nigdy nie uruchamiaj" lub "Nie uruchamiaj". Jeśli wybierzesz opcję "Nigdy nie uruchamiaj" lub "Zawsze uruchamiaj", program PowerShell nie wyświetli monitu o ponowne podanie tego wydawcy.

Metody podpisywania skryptów

Można podpisywać napisane skrypty oraz skrypty uzyskane z innych źródeł. Przed podpisaniem jakiegokolwiek skryptu sprawdź każde polecenie, aby sprawdzić, czy można je bezpiecznie uruchomić.

Aby zapoznać się z najlepszymi rozwiązaniami dotyczącymi podpisywania kodu, zobacz Code-Signing Najlepsze rozwiązania.

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 dotyczący polecenia cmdlet New-SelfSignedCertificate.

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 pisanych na własny użytek oraz do podpisywania skryptów uzyskanych z innych źródeł, które zostały zweryfikowane jako bezpieczne. Nie jest to odpowiednie dla 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 New-SelfSignedCertificate polecenia cmdlet w module PKI. Ten moduł został wprowadzony w programie PowerShell 3.0 i jest zawarty w systemach Windows 8 i Windows Server 2012. Aby uzyskać więcej informacji, zobacz New-SelfSignedCertificate.

$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 do tworzenia certyfikatów MakeCert.exe. 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 narzędzia MakeCert.exe, zobacz Certificate Creation Tool (MakeCert.exe).

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

Uwaga / Notatka

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 poprosi Cię 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ć. To hasło zostanie później użyte do pobrania certyfikatu.

Aby sprawdzić, czy certyfikat został wygenerowany poprawnie, użyj następującego polecenia, aby pobrać certyfikat z magazynu 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 pokażą odcisk o identyfikatorze, 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 zasady wykonywania AllSigned, podpisywanie skryptu pozwala uruchomić skrypt na komputerze.

Poniższy przykładowy skrypt, Add-Signature.ps1, jest przeznaczony do podpisywania skryptu. Jeśli jednak używasz zasad wykonywania AllSigned , musisz podpisać skrypt Add-Signature.ps1, zanim go uruchomisz.

Ważne

Skrypt musi być zapisany przy użyciu kodowania ASCII lub UTF8NoBOM. Można 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 nazwę 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

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

$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
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, potraktuj plik tak, jak w przypadku każdego niepodpisanego skryptu. 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 certyfikatów Certmgr.exe, aby wyeksportować klucz podpisywania i certyfikat do pliku .pfx. 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 wydany przez lokalny główny urząd certyfikacji PowerShell.
  3. Kliknij przycisk Eksportuj, aby uruchomić Kreatora eksportu certyfikatów.
  4. Zaznacz opcję "Tak, wyeksportuj klucz prywatny", a następnie kliknij przycisk Dalej.
  5. Zaznacz opcję "Włącz silną ochronę".
  6. Wpisz hasło, a następnie wpisz je ponownie, aby potwierdzić.
  7. Wpisz nazwę pliku z rozszerzeniem .pfx.
  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 lokalizację pliku pfx utworzonego podczas procesu eksportowania.
  4. Na stronie Hasło wybierz opcję "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 także