✍️Podpisywanie kodu PowerShell w 4 krokach

By PowerShell

W tym wpisie zobaczysz jak utworzyć certyfikat self-signed, jak go dodać do zaufanych oraz jak podpisać nim swój skrypt PowerShell.

Na końcu znajdziesz kod PowerShell, który pomoże Ci tak przygotowany certyfikat przenieść na serwer. Dzięki temu Twoje skrypty będą poprawnie wykonywane przy zasadzie wykonywania AllSigned.

1️⃣
Tworzymy certyfikat, który użyjemy do podpisywania kodu PowerShell.

$paramNewCertificate = @{
    CertStoreLocation = "cert:\currentuser\my" 
    Subject           = "CN=PowerShell Code Signing" 
    KeyAlgorithm      = 'RSA'
    KeyLength         = 2048 
    NotAfter          = (Get-Date).AddYears(2) # <- zmien wartosc jesli ma byc wazny dluzej niz 2 lata
    Provider          = "Microsoft Enhanced RSA and AES Cryptographic Provider" 
    KeyExportPolicy   = 'Exportable'
    KeyUsage          = 'DigitalSignature'
    Type              = 'CodeSigningCert'
}
($Cert = New-SelfSignedCertificate $paramNewCertificate)

2️⃣
Eksportujemy i importujemy tak stworzony certyfikat do Trusted Root Certification Authorities i Trusted Publishers aby był taktowany jako zaufany.

($ExportedCert = Export-Certificate -Cert $Cert.PSPath -FilePath (Join-Path $env:USERPROFILE -ChildPath 'powershell-code-signing.cer'))
Import-Certificate -CertStoreLocation Cert:\LocalMachine\Root -FilePath $ExportedCert.FullName 
Import-Certificate -CertStoreLocation Cert:\CurrentUser\TrustedPublisher -FilePath $ExportedCert.FullName

3️⃣
Podpisujemy skrypt przykładowy PowerShell wcześniej przygotowanym certyfikatem

Get-ChildItem cert:\CurrentUser\My -CodeSigningCert
Set-AuthenticodeSignature -FilePath "D:\przykadlowy-skrypt.ps1" -Certificate $Cert

4️⃣
Testujemy podpisany skrypt, przed tym zmień zasadę wykonywania na AllSigned np. tylko dla aktualnego procesu, następnie wykonaj polecenie.

Set-ExecutionPolicy -Scope Process -ExecutionPolicy AllSigned 
Get-ExecutionPolicy
. 'D:\przykadlowy-skrypt.ps1'
Podpisywanie kodu PowerShell
dodany podpis na końcu skryptu

⚡ Krok dodatkowy
Wcześniejsze kroki spowodowały, że certyfikat jest zaufany tylko w „obecnej lokalizacji”. Wykorzystaj poniższe polecenia by wyeksportowany certyfikat w kroku 2, przenieść na zdalny host.

$CertificatePath = (Join-Path $env:USERPROFILE -ChildPath 'powershell-code-signing.cer')
$Destination = 'C:\'
$ComputerName = 'srv-devops-01'
 
#  moving cert to the destination
$Session = New-PSSession -ComputerName $ComputerName -Credential administrator
Copy-Item -Path $CertificatePath -Destination $Destination -ToSession $Session
 
# importing the certificate on the remote host
$RemoteCertPath = Join-Path $Destination -ChildPath (Split-Path $CertificatePath -Leaf)
Invoke-Command  -Session $Session -ScriptBlock {
    Import-Certificate -CertStoreLocation Cert:\LocalMachine\TrustedPublisher -FilePath $using:RemoteCertPath
    Import-Certificate -CertStoreLocation Cert:\LocalMachine\Root -FilePath $using:RemoteCertPath
}

No comments yet.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

× Close