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.
Ří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.
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
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.
Ří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.