Jak podpisać skrypt PowerShell za pomocą certyfikatu

Podpis cyfrowy skryptu lub pliku wykonywalnego pozwala użytkownikowi sprawdzić, czy plik jest oryginalny i czy jego kod nie został zmieniony przez osoby trzecie. PowerShell ma również wbudowaną możliwość podpisywania pliku skryptu * .ps1.

Możesz podpisać skrypt PowerShell przy użyciu specjalnego typu certyfikatu  Kod Podpisywanie. Ten certyfikat można uzyskać od zewnętrznego komercyjnego urzędu certyfikacji, wewnętrznego korporacyjnego urzędu certyfikacji lub certyfikatu z podpisem własnym (oczywiście nie jest to najlepsza opcja).

Załóżmy, że mamy PKI - usługi certyfikatów Active Directory wdrożone w naszej domenie. Żądamy nowego certyfikatu, przechodząc do strony https: // CA-server-name / certsrv i żądamy nowego certyfikatu z szablonem Podpisywanie kodu (ten szablon musi być wcześniej autoryzowany w konsoli urzędu certyfikacji).

Zainstaluj otrzymany certyfikat w lokalnym magazynie certyfikatów na komputerze.

Po otrzymaniu certyfikatu skonfigurujemy zasady wykonywania skryptów PowerShell, pozwalając na uruchamianie tylko podpisanych skryptów. Domyślna wartość zasad (Ograniczona) blokuje wykonywanie jakichkolwiek skryptów. Aby zezwolić na uruchamianie podpisanych skryptów, możesz zmienić typ zasad na AllSigned lub RemoteSigned, z tą różnicą, że RemoteSigned wymaga podpisu tylko dla skryptów otrzymanych z Internetu.

Set-ExecutionPolicy AllSigned -Force

W osobnym obiekcie zapisz certyfikat z pamięci lokalnej dla bieżącego użytkownika:

$ cert = (Get-ChildItem cert: \ CurrentUser \ my -CodeSigningCert) [0]

Następnie podpiszemy skrypt za pomocą tego certyfikatu:

Set-AuthenticodeSignature -Certificate $ cert -FilePath C: \ PS \ test_script.ps1

Wskazówka. Podczas tworzenia certyfikatu z podpisem własnym do podpisywania kodu za pomocą polecenia cmdlet New-SelfSignedCertificate należy określić typ certyfikatu CodeSigning:

New-SelfSignedCertificate -DnsName test1 -Type CodeSigning

Po wygenerowaniu certyfikatu należy go przenieść z konsoli zarządzania przechowywaniem certyfikatów (certmgr.msc) z kontenera pośredniego do zaufanego katalogu głównego.

Możesz podpisać skrypt za pomocą tego certyfikatu w następujący sposób:

Set-AuthenticodeSignature C: \ PS \ test_script.ps1 @ (gci Cert: \ LocalMachine \ My -DnsName test1 -codesigning) [0]

Po podpisaniu skryptu PowerShell blok podpisu podpisany ramkami zostanie dodany do pliku tekstowego skryptu ps1

# SIG # Rozpocznij blok podpisu
...
...
# SIG # Koniec bloku podpisu

Przy pierwszej próbie uruchomienia skryptu pojawi się ostrzeżenie, jeśli wybierzesz [A] Zawsze biegaj, podczas uruchamiania skryptów podpisanych tym certyfikatem ostrzeżenie nie będzie już wyświetlane.

Czy chcesz uruchomić oprogramowanie tego niezaufanego wydawcy??

Plik C: \ PS \ test_script.ps1 jest publikowany przez CN = test1 i nie jest zaufany w twoim systemie. Uruchamiaj skrypty tylko od zaufanych wydawców.

Wskazówka. Certyfikat głównego urzędu certyfikacji, za pomocą którego skrypt został podpisany, musi być zaufany (w przeciwnym razie skrypt nie uruchomi się wcale). Certyfikat, którym podpisany jest sam skrypt, również musi być zaufany, w przeciwnym razie skrypt zostanie uruchomiony z potwierdzeniem. Oto artykuł, który może ci pomóc: Jak dodać certyfikaty do komputera z domeną za pomocą GPO

Co się stanie, jeśli zmienię kod podpisanego skryptu PowerShell? Jego uruchomienie zostanie zablokowane, co oznacza, że ​​zawartość skryptu została zmieniona.

C: \ PS \ test_script.ps1: Nie można załadować pliku C: \ PS \ test_script.ps1. Zawartość pliku C: \ PS \ test_script.ps1 mogła zostać zmieniona przez nieautoryzowanego użytkownika lub proces, ponieważ skrót pliku nie pasuje do skrótu zapisanego w podpisie cyfrowym. Skrypt nie może działać w określonym systemie.

Tak więc każda modyfikacja podpisanego skryptu będzie wymagała jego ponownego podpisania..