Nasazení certifikační autority v systému GNU/Linux

Většina distribucí systému Linux dnes standardně obsahuje všechny potřebné balíčky pro sprovoznění webového serveru a certifikační autority – apache (popř. httpd), openssl a mod_ssl. Tento návod je specifikován pro distibuci CentOS 5.2

 

V první fázi je tedy nutné ověřit, zdali jsou všechny balíčky nainstalovány.

 

[root@localhost ~]# rpm -q apache httpd openssl mod_ssl

balíček apache není nainstalován

httpd-2.2.3-22.el5.centos

openssl-0.9.8e-7.el5

mod_ssl-2.2.3-22.el5.centos

 

V případě, že některý z balíčku chybí, lze je doinstalovat buďto pomocí rpm –i nebo příkazem yum install.

 

[root@localhost ~]# yum install mod_ssl

 

Loading mirror speeds from cached hostfile

 * base: centos.politechnika.lublin.pl

 * updates: centos.politechnika.lublin.pl

 * addons: centos.politechnika.lublin.pl

 * extras: centos.politechnika.lublin.pl

Setting up Install Process

Parsing package install arguments

Package 1:mod_ssl-2.2.3-22.el5.centos.i386 already installed and latest version

Nothing to do

 

V tomto případě je již balíček nainstalován, proto „Nothing to do“

 

Vytvoření certifikační autority

Prvním krokem bude příprava prostředí pro umístění CA, klíčů, žádostí, certifikátů, apod. Standardně je v distribucich CentOS openssl nainstalovano v /etc/pki/CA Změníme tedy pracovní plochu

 

[root@localhost ~]# cd /etc/pki/CA

 

Vytvoříme adresář, ve kterém budou ukládány certifikáty

 

[root@localhost CA]# mkdir certs

 

Vytvoříme adresář, ve kterém budou ukládány odvolané certifikáty (CRL)

 

[root@localhost CA]# mkdir crl

 

Vytvoříme adresář, ve kterém budou ukládány serverové certifikáty ve formátu PEM

 

[root@localhost CA]# mkdir newcerts

 

Dále vytvoříme soubor index.txt, který je CA používán pro údržbu databáze certifikátů a musí být vytvořen prázdný.

 

[root@localhost CA]# touch index.txt

 

Každý certifikát vydaný touto CA obsahuje sériové číslo. Přídáme tedy text 01 do souboru /etc/pki/CA/serial a /etc/pki/CA/crlnumber . Tyto soubory používá CA pro přiřazování sériových čísel.

 

[root@localhost CA]# echo "01" > serial

[root@localhost CA]# echo "01" > crlnumber

 

Hlavním konfiguračním souborem OpenSSL je soubor openssl.cnf . Ten se standardně nachází v /etc/pki/tls/ a obsahuje zákládní defaultní nastavení. Abychom nemuseli pro naši CA vytvářet tento konfigurační soubor celý ručně, zkopírujeme si tento defaultně nastavený openssl.cnf do adresáře s naší CA.

 

[root@localhost CA]# cp /etc/pki/tls/openssl.cnf openssl.cnf

 

Pomocí textového editoru jednoduše upravíme tento soubor a to především nastavíme správné cesty k adresářům, které jsou definovány v sekci [ CA_default ]. Jelikož se openssl.cnf nachází ve stejném adresáři, kde se budou nacházet i klíče a certifikáty, je vhodné změnit defaultně nastavenou položku dir na aktuální adresář a dále nastavíme cestu ik námi vytvořenému klíči a certifikátu v položkách certificate a private_key.

 

[ CA_default ]

 

dir             = .                # Where everything is kept

certs           = $dir/certs            # Where the issued certs are kept

crl_dir         = $dir/crl              # Where the issued crl are kept

database        = $dir/index.txt        # database index file.

#unique_subject = no                    # Set to 'no' to allow creation of

                                        # several ctificates with same subject.

new_certs_dir   = $dir/newcerts         # default place for new certs.

 

certificate     = $dir/certs/ca.crt       # The CA certificate

serial          = $dir/serial           # The current serial number

crlnumber       = $dir/crlnumber        # the current crl number

                                        # must be commented out to leave a V1 CRL

crl             = $dir/crl.pem          # The current CRL

private_key     = $dir/private/ca.key    # The private key

RANDFILE        = $dir/private/.rand    # private random number file

 


Z hlediska bezpečnosti je dobré znemožnit jakýkoliv přistup k tomuto souboru komukoli jinému, kromě vlastníka.

 

chmod 0600 openssl.cnf

 

Nyní je již vše připraveno a můžeme pomocí příkazu openssl vygenerovat klíče a certifikát pro tuto certifikační autoritu.

 

[root@localhost CA]# openssl req -config openssl.cnf -new -x509 -extensions v3_ca -keyout private/ca.key -out certs/ca.crt -days 3650

Generating a 1024 bit RSA private key

...............++++++

.........++++++

writing new private key to 'private/ca.key'

Enter PEM pass phrase:

Verifying - Enter PEM pass phrase:

-----

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [GB]:CZ

State or Province Name (full name) [Berkshire]:Morava

Locality Name (eg, city) [Newbury]:Brno

Organization Name (eg, company) [My Company Ltd]:Vutbr

Organizational Unit Name (eg, section) []:CA

Common Name (eg, your name or your server's hostname) []:ca.pki_cviceni

Email Address []:ca@pki_cviceni

 

Tento příkaz vytváří dle nastavení v openssl.cnf soukromý klíč serveru ca.key a zároveň vytváří jeho certifikát ca.crt ve formátu X.509, jehož platnost je nastavena na 3650 dni (10let).

 

Také zabezpečíme soukromý klíč serveru, aby jej mohl číst pouze root.

 

[root@localhost CA]# chmod 0400 private/ca.key

 

Zabezpečení webového serveru

Vytvoření certifikátu pro webový server

Obdobným způsobem jako se vytvářely klíče a certifikát pro CA nyní vygenerujeme certifikát a klíče pro webový server.

 

[root@localhost CA]# openssl req -config openssl.cnf -new -nodes -keyout private/pki_cviceni.key -out pki_cviceni.csr -days 365

Generating a 1024 bit RSA private key

............++++++

.............++++++

writing new private key to 'private/pki_cviceni.key'

-----

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [GB]:CZ

State or Province Name (full name) [Berkshire]:Morava

Locality Name (eg, city) [Newbury]:Brno

Organization Name (eg, company) [My Company Ltd]:Vutbr

Organizational Unit Name (eg, section) []:Secure Web Server

Common Name (eg, your name or your server's hostname) []:192.168.0.28

Email Address []:ca@pki_cviceni

 

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []: [ENTER]

An optional company name []: [ENTER]

 

Tímto příkazem jsme vygenerovali soukromý klíč, který bude používán webovým serverem k dešifrování komunikace s webovými klienty. Také jsme současně vytvořili žádost o certifikát pki_cviceni.csr s platností 1rok , která je uložena ve složce CA. Dalším krokem tedy bude podepsání této žádosti a vydání certifikátu.

 

[root@localhost CA]# openssl ca -config openssl.cnf -policy policy_anything -out certs/pki_cviceni.crt -infiles pki_cviceni.csr

Using configuration from openssl.cnf

Enter pass phrase for ./private/ca.key:

Check that the request matches the signature

Signature ok

Certificate Details:

        Serial Number: 1 (0x1)

        Validity

            Not Before: May 13 14:33:01 2009 GMT

            Not After : May 13 14:33:01 2010 GMT

        Subject:

            countryName               = CZ

            stateOrProvinceName       = Morava

            localityName              = Brno

            organizationName          = Vutbr

            organizationalUnitName    = Secure Web Server

            commonName                = 192.168.0.28

            emailAddress              = ca@pki_cviceni

        X509v3 extensions:

            X509v3 Basic Constraints:

                CA:FALSE

            Netscape Comment:

                OpenSSL Generated Certificate

            X509v3 Subject Key Identifier:

                11:3D:43:E7:B0:DF:FA:C4:70:06:8D:80:AC:A0:64:D6:F5:41:F4:7C

            X509v3 Authority Key Identifier:

                keyid:6B:89:85:D7:F6:13:4B:7F:B9:B4:99:52:D3:BC:BA:82:5D:77:79:94

 

Certificate is to be certified until May 13 14:33:01 2010 GMT (365 days)

Sign the certificate? [y/n]:y

 

 

1 out of 1 certificate requests certified, commit? [y/n]y

Write out database with 1 new entries

Data Base Updated

 

Nyní jsme pomocí soukromého klíče CA (samozřejmě po zadání jeho hesla) podepsali požadavek na certifikát a vytvořili tak certifikát pro webový server pki_cviceni.crt

 

Posledním krokem je vygenerování seznamu odvolaných certifikátů (CRL)

 

[root@localhost CA]# openssl ca -config openssl.cnf -gencrl -out crl/ca.crl

Using configuration from openssl.cnf

Enter pass phrase for ./private/ca.key:

 

Propojení webového serveru s CA

Posledním nezbytným krokem je propojení webového serveru s připravenou certifikační autoritou. Nejdříve si ověříme, zda-li webový server je opravdu spuštěný

 

[root@localhost CA]# service httpd status

httpd (pid 3556 3555 3554 3553 3552 3551 3550 3549 3514) běží...

 

Propojení webového serveru s CA zajišťuje nádstavbový modul mod_ssl. Jeho nastavení je v distribuci CentOS standardně uloženo v souboru /etc/httpd/conf.d/ssl.conf

Standardně je komunikaci prostřednictvím SSL/TLS povolena, stačí tedy v konfiguračním souboru nastavit cestu k veřejnému (SSLCertificateFile) a soukromému (SSLCertificateKeyFile) klíči serveru. Pomocí editoru tedy upravíme následujicí položky v ssl.conf

 

[root@localhost CA]# cd /etc/httpd/conf.d

[root@localhost conf.d]# vi ssl.conf

 

Upravit cestu ke klíčům u následujících položek:

SSLCertificateFile /etc/pki/CA/certs/pki_cviceni.crt

 

SSLCertificateKeyFile /etc/pki/CA/private/pki_cviceni.key

 

Posledním krokem je zrestartování httpd démona s novým nastavením.

[root@localhost conf.d]# service httpd restart

Ukončuji httpd:                                            [  OK  ]

Spouštím httpd:                                            [  OK  ]

 

V tuto chvíli by měl být webový server připraven obsluhovat požadavky na zabezpečenou komunikaci. Funkčnost ověříme přístupem na vlastní webové stránky přes protokol https.

 

Pozor! Vzhledem k tomu, že certifikát byl podepsán vlastní certifikační autoritou, která je samozřejmě pro prohlížeče nedůvěryhodná, bude prohlížeč upozorňovat na problém s nedůvěryhodným certifikátem. Řešením je buďto certifikát dočasně přijmout, nebo přidat vydávající CA do důvěryhodných certifikačních autorit.

image001.png, 85kB

Řízení přístupu k webovým stránkám pomocí PKI

Vytvoření páru klíčů a certifikát veřejného klíče pro uživatele

Z hlediska bezpečnosti je nezbytné, aby si každý uživatel generoval pár klíčů se žádostí o certifikát sám prostřednictvím vlastního PC a k registrační autoritě se dostavil jen s žádostí o certifikát. Tím se zamezuje případnému získání  jeho soukromého klíče třetí osobou. V praxi se toto generování provádí buďto prostřednictvím webové aplikace napojené přímo na RA, na níž je po vygenerování klíčů přímo odeslána žádost o certifikát, nebo ještě lépe prostřednictvím USB tokenů, nebo čipových karet. Výrobci těchto zařízení dodávají spolu s tímto hardware zpravidla i software k jejich správě. Pomocí tohoto softwaru si pak uživatel může vygenerovat pár klíčů, přičemž soukromý klíč nikdy neopouští úložiště těchto zařízení a všechny kryptografické operace probíhají přímo prostřednictvím jejích čipů.

V rámci demonstrace si však pro výukové účely vystačíme s generováním klíčů prostřednictvím serveru a jejich následným exportem do formátu p12, speciálně určeném právě pro tyto účely.

 

V první řadě si pomocí již známého příkazu vygenerujeme pár klíčů spolu s žádostí o certifikát s platností 1 rok.

[root@localhost CA]# openssl req -config openssl.cnf -new -nodes -keyout private/jvonasek.key -out jvonasek.csr -days 365 

Generating a 1024 bit RSA private key

....++++++

......++++++

writing new private key to 'private/jvonasek.key'

-----

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [GB]:CZ

State or Province Name (full name) [Berkshire]:Morava

Locality Name (eg, city) [Newbury]:Brno

Organization Name (eg, company) [My Company Ltd]:Vutbr

Organizational Unit Name (eg, section) []:Feec

Common Name (eg, your name or your server's hostname) []:Josef Vonasek

Email Address []:jvonasek@pki_cviceni

 

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:

 

Stejně jako v případě žádosti o certifikát pro webový server tuto žádost prostřednictvím soukromého klíče CA podepíšeme a tento certifikát uložíme k ostatním certifikátům do adreáře certs.

[root@localhost CA]# openssl ca -config openssl.cnf -policy policy_anything -out certs/jvonasek.crt -infiles jvonasek.csr  Using configuration from openssl.cnf

Enter pass phrase for ./private/ca.key:

Check that the request matches the signature

Signature ok

Certificate Details:

        Serial Number: 2 (0x2)

        Validity

            Not Before: May 14 11:20:55 2009 GMT

            Not After : May 14 11:20:55 2010 GMT

        Subject:

            countryName               = CZ

            stateOrProvinceName       = Morava

            localityName              = Brno

            organizationName          = Vutbr

            organizationalUnitName    = Feec

            commonName                = Josef Vonasek

            emailAddress              = jvonasek@pki_cviceni

        X509v3 extensions:

            X509v3 Basic Constraints:

                CA:FALSE

            Netscape Comment:

                OpenSSL Generated Certificate

            X509v3 Subject Key Identifier:

                4B:1C:48:DE:6B:32:2C:C4:36:BB:C1:4D:9B:3C:65:65:A9:D9:C3:FA

            X509v3 Authority Key Identifier:

                keyid:6B:89:85:D7:F6:13:4B:7F:B9:B4:99:52:D3:BC:BA:82:5D:77:79:94

 

Certificate is to be certified until May 14 11:20:55 2010 GMT (365 days)

Sign the certificate? [y/n]:y

 

 

1 out of 1 certificate requests certified, commit? [y/n]y

Write out database with 1 new entries

Data Base Updated

 

Certifikát X509 zobrazíte pro kontrolu v textové podobě následujícím příkazem:

[root@localhost CA]# openssl x509 -noout -text -in certs/jvonasek.crt

Certificate:

    Data:

        Version: 3 (0x2)

        Serial Number: 2 (0x2)

        Signature Algorithm: sha1WithRSAEncryption

        Issuer: C=CZ, ST=Morava, L=Brno, O=Vutbr, OU=CA, CN=ca.pki_cviceni/emailAddress=ca@pki_cviceni

        Validity

            Not Before: May 14 11:20:55 2009 GMT

            Not After : May 14 11:20:55 2010 GMT

        Subject: C=CZ, ST=Morava, L=Brno, O=Vutbr, OU=Feec, CN=Josef Vonasek/emailAddress=jvonasek@pki_cviceni

        Subject Public Key Info:

            Public Key Algorithm: rsaEncryption

            RSA Public Key: (1024 bit)

                Modulus (1024 bit):

                    00:a7:78:c5:1e:88:2f:3b:76:45:67:a5:f7:fe:2d:

                    83:fc:1f:6f:e8:db:95:f9:e0:51:97:a1:4c:2c:3a:

                    3f:83:44:fd:86:1c:1a:a7:4d:4f:a7:bb:88:6c:a7:

                    8e:8f:ca:90:ba:96:f5:a2:cc:04:02:5c:44:d9:c3:

                    b9:ab:9d:fc:90:89:b6:18:49:ee:c0:07:df:b6:19:

                    16:72:55:f8:94:be:c4:a0:11:bc:6e:b1:e5:88:a3:

                    4e:33:6b:42:80:2d:24:11:75:05:a1:95:4b:ed:36:

                    7a:62:95:f0:d5:f8:f3:a2:e3:22:fa:3d:bf:7c:7c:

                    35:c9:fd:14:e7:4e:ee:0a:71

                Exponent: 65537 (0x10001)

        X509v3 extensions:

            X509v3 Basic Constraints:

                CA:FALSE

            Netscape Comment:

                OpenSSL Generated Certificate

            X509v3 Subject Key Identifier:

                4B:1C:48:DE:6B:32:2C:C4:36:BB:C1:4D:9B:3C:65:65:A9:D9:C3:FA

            X509v3 Authority Key Identifier:

                keyid:6B:89:85:D7:F6:13:4B:7F:B9:B4:99:52:D3:BC:BA:82:5D:77:79:94

 

    Signature Algorithm: sha1WithRSAEncryption

        9c:1f:14:2e:8f:f1:ab:8b:8e:00:be:b1:5a:e4:33:30:c0:de:

        15:c4:a6:ec:98:79:c9:d1:55:d7:72:24:63:d3:6b:e1:18:a4:

        f7:4d:30:f2:c4:ea:31:2a:86:4f:83:b9:be:b0:ab:d7:90:9e:

        9e:b0:44:ac:01:ad:3f:7b:1a:d9:a8:43:cb:51:f8:ab:73:42:

        4b:4c:bd:d1:ab:a0:80:eb:47:37:47:30:ca:7e:45:eb:32:74:

        c9:4d:56:4c:66:e2:22:43:c0:65:1e:f3:c2:59:b7:a9:aa:86:

        94:26:48:a6:0b:17:20:81:11:8f:40:6e:03:fc:b2:4c:e0:c6:

        9e:67

 

V tuto chvíli je tedy certifikát s klíči připraven pro další práci. Abychom jej mohli použít v hostitelském PC, je nutné pár klíčů spolu s podepsaným certifikátem vyexportovat do formátu p12. Vzhledem k tomu, že soubor bude obsahovat i soukromý klíč, je nutné práci s ním zabezpečit autentizací heslem. Exportovaný soubor bude uložen v adresáři export.

[root@localhost CA]# mkdir export

[root@localhost CA]# openssl pkcs12 -export -in certs/jvonasek.crt -inkey private/jvonasek.key -out export/jvonasek.p12

Enter Export Password:

Verifying - Enter Export Password:

 

Nyní je již soukromý klíč spolu s certifikátem obsahujícím veřejný klíč připravený k exportu do jiného PC. Soubor jvonasek.p12 nyní přeneseme do hostitelského operačního systému dle možností buďto pomocí flash disku, nebo prostřednictvím ftp. Pokud nemáte jinou možnost je možné soubor překopírovat do adresáře, kde se nachází webové stránky a odtud jej pak stáhnout prostřednictvím http protokolu.

[root@localhost CA]# cp /etc/pki/CA/export/jvonasek.p12 /var/www/html/jvonasek.p12

 

Současně si zpřístupníme i certifikát kořenové CA, abychom ji mohli přidat mezi důvěryhodné certifikační autority čímž se do budoucna zabrání při přístupu přes https protokol varování, že server používá nedůvěryhodný certifikát.

[root@localhost CA]# cp /etc/pki/CA/certs/ca.crt /var/www/html/ca.crt

 

Nyní na moment opustíme virtuální systém a přepneme se do hostitelských Windows. Do prohlížeče zadáme přímou cestu k uloženému certifikátu (IP adresu virtuálního systému/soubor.p12) a stáhneme soubor na lokální PC.

stazeni_p12.PNG, 90kB

 

Po stažení a otevření souboru se spustí Průvodce importem certifikátu. Pokračujeme tlačítkem další, potvrdíme umístění souboru další. V dalším okně zadáme heslo k soukromému klíči, které jsme zvolili v průběhu exportu a zatrhneme Povolit silnou ochranu soukromého klíče, pokud vyžadujeme, aby při každém použití soukromého klíče bylo požadováno ověření tohoto hesla. Posledním krokem je volba úložiště certifikátu, do kterého bude certifikát naimportován. V tomto případě můžeme ponechat automatickou volbu, systém Windows rozpozná, že se jedná o osobní certifikát.

Úspěšné naimportování certifikátu ověříme spuštěním aplikace Internet Explorer v nabídce Nástroje → Možnosti Internetu → Obsah → Certifikáty

uloziste.PNG, 19kB

 

Nyní ještě přidáme kořenovou certifikační autoritu mezi důvěryhodné certifikační autority. Do prohlížeče zadáme přímou cestu k uloženému certifikátu (IP adresu virtuálního systému/ca.crt) a stáhneme soubor na lokální PC. Po spuštění certifikátu zvolíme možnost Nainstalovat certifikát a na závěr potvrdíme, že této certifikační autoritě opravdu důvěřujeme.

instalace_CA.PNG, 24kB

 

 

Řízení přístupu k webovému serveru

Nastavení přístupu k webovému serveru je stejně jako nastavení samotného zabezpečení webového serveru protokolem https uloženo v souboru /etc/httpd/conf.d/ssl.conf

Řízení přístupu zajišťuje direktiva SSLVerifyClient, dále je nezbytné nastavit cestu k CA, která podepisuje certifikáty uživatelům, kteří budou přistupovat k serveru a také cestu k seznamu zneplatněných certifikátů CRL.

[root@localhost CA]# cd /etc/httpd/conf.d

[root@localhost conf.d]# vi ssl.conf

 

SSLCACertificateFile /etc/pki/CA/certs/ca.crt //odkomentovat a změnit cestu

SSLCARevocationFile /etc/pki/CA/crl/ca.crl      //doplnit

 

SSLVerifyClient require

SSLVerifyDepth  1      

 

Nyní jsme nastavili cesty k CA a CRL a nastavili nutnost autentizace certifikátem při spojení pomocí protokolu https. Direktiva SSLVerifyDepth hodnotou 1 určuje, že certifikát klienta bude ověřováň pouze u nejbližší certifikační autority, kterou server zná (SSLCACertificateFile).

 

Pokud budete požadovat, aby přístup na stránky byl umožněn výhradně pomocí zaezpečeného protokolu https, je nezbytné nastavit pravidlo přepisující všechny http požadavky, na požadavky https na portu 443. Toto umožňuje modul mod_rewrite. Ten je možno nastavit přímo v httpd.conf přidáním následujících direktiv.

<IfModule mod_rewrite.c>

     RewriteEngine on

      RewriteCond %{SERVER_PORT} !^443$

      RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

</IfModule>

 

 Po změně nastavení je opět nutné zrestartovat httpd démona, aby se tyto změny aplikovaly.

 

 

Ověření korektní instalace

V tuto chvíli tedy webový server obsluhuje všechny požadavky pouze prostřednictvím SSL/TLS protokolu a současně je vstup na webové stránky umožnen pouze držitelům certifikátu podepsaným námi nainstalovanou certifikační autoritou.

Z klientské stanice nyní zadáme IP adresu webového serveru. Požadavek bude ihned přesměrován na zabezpečený https protokol a současně je uživatel vyzván k autentizaci prostřednictvím svého soukromého klíče.

autentizace.PNG, 79kB