Szkriptek digitális aláírása

Láttuk a fejezet elején, hogy a szkriptek futtatását engedélyezni kell. Ha a legbiztonságosabb futtatási házirenddel dolgozunk, akkor csak olyan szkript futhat, amelyik digitálisan alá van írva , és az aláírást igazoló tanúsítványt az adott gép elismeri biztonságos tanúsítványnak. Na de honnan lesz nekünk ilyen tanúsítványunk?

Az első lehetőség, hogy van már kiépített PKI infrastruktúránk, amelyben van „code signing” típusú tanúsítványt kiosztani képes CA kiszolgáló. Innen igényelni kell ilyen tanúsítványt, és ezzel fogunk tudni dolgozni a később leírt módon.

A problematikusabb helyzet az, amikor nincs ilyen PKI infrastruktúránk. Például én otthon szeretnék aláírt szkripteket létrehozni, hogy tesztelhessem a működésüket. Ebben az esetben létrehozhatok un. önaláírt tanúsítványt, amelyet csak azok a gépek fognak elismerni hitelesnek, ahova manuálisan telepítem azokat.

Nézzünk ennek lépéseit! Honnan szedek én önaláírt tanúsítványt? Direkt ilyen tesztelési célokra van a .NET Framework Software Development Kit-ben (letölthető: http://msdn2.microsoft.com/en-us/netframework/aa731542.aspx) egy makecert.exe  segédprogram, amely erre képes.

Ez egy parancssori eszköz, nézzük meg a meghívásának paramétereit:

C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0>"C:\Program Files\Micros

oft Visual Studio 8\SDK\v2.0\Bin\makecert.exe" -!

Usage: MakeCert [ basic|extended options] [outputCertificateFile]

Extended Options

 -sc  <file>         Subject's certificate file

 -sv  <pvkFile>      Subject's PVK file; To be created if not present

 -ic  <file>         Issuer's certificate file

 -ik  <keyName>      Issuer's key container name

 -iv  <pvkFile>      Issuer's PVK file

 -is  <store>        Issuer's certificate store name.

 -ir  <location>     Issuer's certificate store location

                        <CurrentUser|LocalMachine>.  Default to 'CurrentUser

'

 -in  <name>         Issuer's certificate common name.(eg: Fred Dews)

 -a   <algorithm>    The signature algorithm

                        <md5|sha1>.  Default to 'md5'

 -ip  <provider>     Issuer's CryptoAPI provider's name

 -iy  <type>         Issuer's CryptoAPI provider's type

 -sp  <provider>     Subject's CryptoAPI provider's name

 -sy  <type>         Subject's CryptoAPI provider's type

 -iky <keytype>      Issuer key type

                        <signature|exchange|<integer>>.

 -sky <keytype>      Subject key type

                        <signature|exchange|<integer>>.

 -l   <link>         Link to the policy information (such as a URL)

 -cy  <certType>     Certificate types

                        <end|authority>

 -b   <mm/dd/yyyy>   Start of the validity period; default to now.

 -m   <number>       The number of months for the cert validity period

 -e   <mm/dd/yyyy>   End of validity period; defaults to 2039

 -h   <number>       Max height of the tree below this cert

 -len <number>       Generated Key Length (Bits)

 -r                  Create a self signed certificate

 -nscp               Include netscape client auth extension

 -eku <oid[<,oid>]>  Comma separated enhanced key usage OIDs

 -?                  Return a list of basic options

 -!                  Return a list of extended options

Nem egyszerű, de kezdjünk neki. Első lépésként a makecert-et rá kell bírni, hogy tanúsítványkiosztó hatóság szerepét vegye fel:

makecert -n "CN=PowerShell Sajat Root CA" -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -sv c:\cert\root.pvk c:\cert\root.cer -ss Root -sr localMachine

Nézzük az egyes paraméterek jelentését:

Paraméter

Jelentés

-n "CN=PowerShell Sajat Root CA"

A tanúsítványkiosztóm neve

-a sha1

A digitális aláírás algoritmusa

-eku 1.3.6.1.5.5.7.3.3

A kiosztandó tanúsítványok fajtája, ez a szám jelenti a „Code signing” lehetőséget

-r

Önaláírt legyen a tanúsítványkiosztó tanúsítvány

-sv c:\cert\root.pvk c:\cert\root.cer

A tanúsítványkiosztó tanúsítványainak tárolási helye fájl szinten

-ss Root

A tanúsítványkiosztó tanúsítványainak tárolási helye a tanúsítványtárban

-sr localMachine

Méghozzá a helyi gépen

Amikor ezt a parancsot futtatom, akkor kétszer is megjelenik egy jelszóbekérő ablak, ami a privát kulcsok kezelésének védelmét szolgálja. Az első esetben adjuk meg a privátkulcshoz való hozzáférés jelszavát:

45 . ábra Makecert.exe futtatása tanúsítványkiosztó szerep céljára

A második esetben pedig már használja is a háttérben a makecert ezt a privát kulcsot, ezért kéri be az előbb megadott jelszót:

46 . ábra Jelszóbeadás a privát kulcshoz való hozzáféréskor

Tehát idáig azt csináltuk, hogy létrehoztunk egy tanúsítványkiosztó önaláírt tanúsítványt, amellyel alá lesznek írva az ezután legenerálható, immár ténylegesen kódaláírásra szánt tanúsítványaink. Hozzunk is mindjárt létre egy ilyet:

makecert -pe -n "CN=Soos Tibi PS Guru" -ss PSCS -a sha1 -eku 1.3.6.1.5.5.7.3.3 -iv c:\cert\root.pvk -ic c:\cert\root.cer

Nézzük ezeknek a jelentését:

Paraméter

Jelentés

-pe

Exportálható privát kulcsot hoz létre (exportálással biztonságba tudjuk helyezni)

-n "CN=Soos Tibi PS Guru"

A kódaláíró tanúsítványon szereplő név

-ss PSCS

A tanúsítvány tárolásának a helye, én itt egy új tárolót hoztam létre, ha személyes tárolóba szeretném berakni, akkor arra a „My” névvel lehet hivatkozni

-a sha1

Digitális aláírás algoritmusa

-eku 1.3.6.1.5.5.7.3.3

Tanúsítvány célja (code signing)

-iv c:\cert\root.pvk

A kiosztó hatóság privát kulcsa

-ic c:\cert\root.cer

Az én tanúsítványomat viszonthitelesítő tanúsítvány

Miután ezen parancs futtatása során is használjuk az első lépésben létrehozott privát kulcsot, így újra meg kell adni az ott megadott jelszót:

47 . ábra A kódaláíró tanúsítvány generálása során megjelenő jelszóbekérő

Ha ezt is sikeresen lefuttattam, akkor megnézhetem, hogy a tanúsítványtáramban tényleg ott van-e a kódaláíró tanúsítvány:

48 . ábra Kódaláíró tanúsítványom a tanúsítványtárban

Akkor most már van alkalmas kódaláíró tanúsítványom. Itt csatlakoznak be azok az olvasók, akiknek van „igazi” PKI infrastruktúrájuk, és egy normál tanúsítványkiosztótól szereztek kódaláíró tanúsítványt.

Most lehet aláírni a szkriptemet. Elsőként ragadjuk meg az aláírásra szánt tanúsítványunkat (itt nagyon nagy segítség a TAB-kiegészítés, azaz nem kell azt a hosszú számsort begépelni, ha a „könyvtárra” rálelünk, akkor elég a TAB-bal léptetni):

[9] PS C:\old> $signcert = (get-item cert:\CurrentUser\PSCS\8ED2798A04D5F794

DA6C8C3C167EB033CB8BE6C2)

[10] PS C:\old> $signcert

 

 

    Directory: Microsoft.PowerShell.Security\Certificate::CurrentUser\PSCS

 

 

Thumbprint                                Subject

----------                                -------

8ED2798A04D5F794DA6C8C3C167EB033CB8BE6C2  CN=Soos Tibi PS Guru

És akkor következzen a lényeg, írjuk alá a szkriptet az előbb betöltött tanúsítvánnyal:

[11] PS C:\old> Set-AuthenticodeSignature safe.ps1 $signcert

 

 

    Directory: C:\old

 

 

SignerCertificate                         Status           Path

-----------------                         ------           ----

8ED2798A04D5F794DA6C8C3C167EB033CB8BE6C2  Valid            safe.ps1

Állítsuk át a végrehajtási házirendet úgy, hogy mindenképpen megkövetelje az aláírást, és futtatom a safe.ps1 szkriptemet:

[12] PS C:\old> Set-ExecutionPolicy allsigned

[13] PS C:\old> .\safe.ps1

 

Do you want to run software from this untrusted publisher?

File C:\old\safe.ps1 is published by CN=Soos Tibi PS Guru and 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"):a

Titkos script!

Miután ez egy önaláírt tanúsítványon alapuló tanúsítvány, így a rendszer rákérdez, hogy elfogadom-e hitelesnek? Én azt válaszoltam, hogy igen, sőt, minden alkalommal fogadja el ezt hitelesnek (Always) innentől kezdve.

Nézzük meg, hogy hogyan is néz ki egy ilyen aláírt szkript:

49 . ábra Az elektronikusan aláírt szkript

Az eredeti szkriptem nagyon egyszerű volt, csak annyit csinált, hogy kiírta „Titkos script!”.  Ez olvasható is az első sorban. Ami utána áll az az elektronikus aláírás.

Ha bármit módosítok ebben a szkriptben, akár egy karaktert is, és futtatni akarom, akkor a következő hibajelzést fogom kapni:

[14] PS C:\old> .\safe.ps1

File C:\old\safe.ps1 cannot be loaded. The contents of file C:\old\safe.ps1

 may have been tampered because the hash of the file does not match the has

h stored in the digital signature. The script will not execute on the syste

m. Please see "get-help about_signing" for more details..

At line:1 char:10

+ .\safe.ps1 <<<<

Ha sértetlen a szkriptem, akkor ellenőrizhetem, hogy ki is írta alá, azaz értelmeztethetem azt a sok zűrös karaktert a szkriptem végén:

[17] PS C:\old> Get-AuthenticodeSignature C:\old\safe.ps1 | fl

 

 

SignerCertificate      : [Subject]

                           CN=Soos Tibi PS Guru

 

                         [Issuer]

                           CN=PowerShell Sajat Root CA

 

                         [Serial Number]

                           123B087E7C0B44934585DF9A4B374842

 

                         [Not Before]

                           2008.04.17. 21:57:56

 

                         [Not After]

                           2040.01.01. 0:59:59

 

                         [Thumbprint]

                           8ED2798A04D5F794DA6C8C3C167EB033CB8BE6C2

 

TimeStamperCertificate :

Status                 : Valid

StatusMessage          : Signature verified.

Path                   : C:\old\safe.ps1



Word To HTML Converter