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 ograniczonego wykonywania nie zezwalają na uruchamianie skryptów. Zasady wykonywania AllSigned i RemoteSigned uniemożliwiają uruchamianie skryptów, które nie mają podpisu cyfrowego przez program PowerShell.

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 użytku.

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 (wartość domyślna) prawdopodobnie będą obowiązywać.

Zasady z ograniczeniami nie zezwalają na uruchamianie 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 go ufasz. Skrypty mają taki sam efekt jak każdy program wykonywalny.

Aby uruchomić niepodpisany skrypt, użyj polecenia cmdlet Unblock-File 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 został jeszcze wybrany do 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 pozycję "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 uruchomienie dla tego wydawcy.

Metody podpisywania skryptów

Możesz podpisać skrypty, które piszesz, oraz skrypty, które uzyskujesz 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 polecenia cmdlet New-SelfSignedCertificate.

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

  • Certyfikaty utworzone przez urząd certyfikacji: za opłatę publiczny urząd certyfikacji weryfikuje twoją tożsamość i daje 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 używa się certyfikatu z podpisem własnym tylko do podpisywania skryptów, które są pisane do własnego użytku i do podpisywania skryptów uzyskanych z innych źródeł, które zostały zweryfikowane, aby były bezpieczne. Nie jest to odpowiednie dla skryptów, które będą współużytkowane, 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 są zawarte 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ł jest wprowadzany w programie PowerShell 3.0 i jest zawarty w 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 MakeCert.exedo tworzenia certyfikatów. To narzędzie jest uwzględnione w zestawie SDK platformy .NET Microsoft (wersje 1.1 i nowsze) oraz w 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świetli monit o podanie hasła klucza prywatnego. Hasło gwarantuje, że nikt nie może korzystać z certyfikatu ani uzyskiwać do niego dostępu bez zgody. Utwórz i wprowadź hasło, które możesz zapamiętać. To hasło będzie później używane do pobierania certyfikatu.

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 pokazują odcisk palca , który identyfikuje certyfikat w wyświetlaczu podobny 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 zezwala na uruchamianie skryptu na komputerze.

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

Ważne

Skrypt musi zostać zapisany 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 moduł zawierający skrypt nie może zostać zaimportowany. 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.ps1nazwę .

## 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świetli ten komunikat podczas uruchamiania skryptu, który nie został napisany, traktuj plik tak, jak w przypadku skryptu bez znaku. Przejrzyj kod, aby określić, czy można 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 uwzględniony w zestawie SDK platformy .NET Microsoft, Microsoft Windows SDK i w programie Internet Explorer.

Aby wyeksportować certyfikat:

  1. Uruchom Menedżera certyfikatów.
  2. Wybierz certyfikat wystawiony przez główny certyfikat lokalny 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 rozszerzeniem nazwy pliku 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 eksportu.
  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 magazyn certyfikatów osobistych.
  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ą korzystać ze skryptu przez wiele lat.

Zobacz też