Jak łatwo podpisać skrypt PowerShell?

15

Wolałbym używać zasad wykonywania AllSigned w PowerShell, ale samopodpisywanie moich skryptów wymaga kilkuset megabajtów pobierania i instalacji, a proces podpisywania wydaje się kłopotliwy.

Czy istnieje prostszy sposób na podpisanie skryptu PowerShell niż opisano w dokumentacji?

Ville Koskinen
źródło

Odpowiedzi:

7

Aby wykonać podpisywanie, możesz użyć polecenia Set-AuthenticodeSignaturecmdlet. To oczywiście wymaga certyfikatu. Jeśli masz urząd certyfikacji (mało prawdopodobne), który będzie w stanie utworzyć certyfikat podpisujący kod. W przeciwnym razie istnieją różne narzędzia do tworzenia samopodpisanego certyfikatu.

Instalujesz certyfikat w swoim magazynie certyfikatów ( aby to zrobić, otwórz plik .cerlub .pfxw Eksploratorze Windows), a następnie przekaż go Set-AuthenticodeSignature( cert:dostawca / dysk daje dostęp do certyfikatów w twoim sklepie).

Posługiwać się

help about_signing

lub w wersji online tego tematu pomocy, aby uzyskać szczegółowe informacje (w tym tworzenie samopodpisanego certyfikatu za pomocą narzędzi zestawu Windows SDK [1] ).

[1] Zakładam, że jest to duże pobieranie, o którym mówisz: możesz po prostu zainstalować potrzebne bity lub skorzystać z innych narzędzi (OpenSSL obejmuje generowanie certyfikatów). Uzyskanie zestawu SDK jest w tym celu działaniem jednorazowym.

Richard
źródło
Akceptuję tę odpowiedź i zakładam, że nie ma skrótu, a podpisywanie musi być wykonane jak wspomniano w dokumentacji.
Ville Koskinen,
1
Podobnie jak kilka „rzeczy dla programistów”, początkowa konfiguracja i nauka jest trudna, ale rzeczywista praktyka (zwłaszcza jeśli jest wykonywana regularnie) nie jest.
Richard
7

Używam tego skryptu PowerShell:

## sign-script.ps1
## Sign a powershell script with a Thawte certificate and 
## timestamp the signature
##
## usage: ./sign-script.ps1 c:\foo.ps1 

param([string] $file=$(throw “Please specify a script filepath.”)) 

$certFriendlyName = "Thawte Code Signing"
$cert = gci cert:\CurrentUser\My -codesigning | where -Filter 
  {$_.FriendlyName -eq $certFriendlyName}

# https://www.thawte.com/ssl-digital-certificates/technical-  
#   support/code/msauth.html#timestampau
# We thank VeriSign for allowing public use of their timestamping server.
# Add the following to the signcode command line: 
# -t http://timestamp.verisign.com/scripts/timstamp.dll 
$timeStampURL = "http://timestamp.verisign.com/scripts/timstamp.dll"

if($cert) {
    Set-AuthenticodeSignature -filepath $file -cert $cert -IncludeChain All -   
      TimeStampServer $timeStampURL
}
else {
    throw "Did not find certificate with friendly name of `"$certFriendlyName`""
}
Bratch
źródło
5

Po uzyskaniu certyfikatu chciałem korzystać z importu na moim koncie użytkownika. Ten regkey dał mi opcję, Sign , w menu kontekstowym (używam Windows 7). Jeśli certyfikat, który chcesz podpisać, jest przechowywany inaczej, po prostu zmień polecenie PowerShell na końcu.

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\Microsoft.PowerShellScript.1]

[HKEY_CURRENT_USER\Software\Classes\Microsoft.PowerShellScript.1\Shell]

[HKEY_CURRENT_USER\Software\Classes\Microsoft.PowerShellScript.1\Shell\Sign]

[HKEY_CURRENT_USER\Software\Classes\Microsoft.PowerShellScript.1\Shell\Sign\Command]
@="C:\\\Windows\\\System32\\\WindowsPowerShell\\\v1.0\\\powershell.exe -command Set-AuthenticodeSignature '%1' @(Get-ChildItem cert:\\\CurrentUser\\\My -codesigning)[0]"
Fawr
źródło