Motto

Každá síť je taková, jaký je její administrátor.

Navigace:   Úvod Rady - tipy - triky Vychytávky v Linuxu Certifikáty a SSL v Apache serveru
Certifikáty a SSL v Apache serveru PDF Tisk Email
Neděle, 19 Duben 2009 13:09

Chcete spustit na svém web serveru zabezpečený port? Není problém, stačí vystavit certifikáty a zkonfigurovat server. Nebudeme se zde zabývat hlubší teorií, tu si můžete nastudovat jinde, tady vyřešíme jen vytváření certifikátů a zprovoznění Apache serveru. Pro vytváření certifikátů použijeme toolkit OpenSSL.

Princip je velmi jednoduchý, Apache server musí mít nahraný modul SSL, pomocí kterého bude naslouchat na portu 443. Pomocí konfigurace modulu SSL si načte certifikát a klíč. Klient se připojí k serveru s nahraným certifikátem CA (certifikační autority), který podepsal i serverový certifikát. Pak bude probíhat zašifrovaný přenos korektně.

Self-signed certifikáty

Prvně si ukážeme jak vystavit certifikáty podepsané samy sebou. Takto pak vystavíte certifikát vlastní CA. Můžete na nich otestovat funkci https. Postup můžete zkrátit na jeden řádek:

  • # openssl req -new -x509 -days 3650 -nodes -keyout server.key -out server.pem

Při generování budete muset zadávat nějaké údaje, důležitý je pouze údaj "Common Name", ten v tomto případě musí obsahovat doménu vašeho https serveru.

Vysvětlivky:

  • req - příkaz openssl, jedná se o vystavení certifikátu nebo certifikační žádosti
  • nodes - vytvoří klíč bez hesla
  • x509 - rovnou podepsaný certifikát
  • days - počet dnů platnosti certifikátu

Nebo můžete použít postup na více řádků, tj. prvně vygenerovat klíč a následně certifikát:

  • # openssl genrsa -des3 -out server.key -rand rand.dat 1024
  • # openssl req -new -x509 -days 3650 -key server.key -out server.pem

Vysvětlivky:

  • genrsa - příkaz openssl, jedná o generování rsa klíče
  • des3 - bude vyžadováno heslo klíče
  • rand - soubor pro generování náhodných čísel (u příkazu genrsa nutný)

Pokud si vystavíte klíč s heslem a chcete se hesla zbavit (pro automatické spuštění Apache2 nutné), můžete použít příkaz rsa:

  • # openssl rsa -in server.key -out servernopass.key

Tímto jste vytvořili certifikát podepsaný sám sebou. Na jeho obsah se můžete podívat příkazem:

  • # openssl x509 -in server.pem -text

S tímto certifikátem se již dá něco dělat. Pokud s ním rozjedete Apache, může si stejný certifikát naimportovat do prohlížeče klient a následně se korektně připojit k serveru. Takové řešení samozřejmě není příliš bezpečné, protože všichni klienti i server pracují se stejným certifikátem. Proto vystavíme další certifikát, speciálně pro server, a ten bude podepsán certifikační autoritou.

Serverový a CA certifikáty

Vše bude probíhat v jednom adresáři (např. "pokus"). Abychom se vyhnuli problémům při generování, je potřeba ještě připravit adresářovou strukturu nutnou pro některé nástroje. Adresářová struktura bude vypadat následovně:

  • ./pokus
  • ./pokus/demoCA
  • ./pokus/demoCA/certs
  • ./pokus/demoCA/crl
  • ./pokus/demoCA/newcerts
  • ./pokus/demoCA/private

A teď ještě tři textové soubory:

  • ./pokus/index.txt
  • ./pokus/index.txt.attr
  • ./pokus/serial

Do souboru serial musíte vepsat číslo "00" na první řádek (bez uvozovek), jedná se o počítadlo vygenerovaných certifikátů. A do souboru index.txt.attr vepiště na první řádek "unique_subject = no".

Tímto je vše připravené a můžete se pustit generování. Pokud nemáte certifikát CA, v adresáři "pokus" jej tedy vytvořte. Prvně klíč certifikátu CA (v našem případě zaheslovaný):

  • # openssl genrsa -des3 -out ca.key -rand rand.dat 1024

A poté samotný self-signed certifikát CA:

  • # openssl req -new -x509 -days 3650 -key ca.key -out ca.pem

Bude to chtít nějaké údaje, tak je vyplňte dle vlastního uvážení. Defacto nejsou nijak důležité (ani údaj "Common Name") pouze definují CA.

Následně vygenerujeme klíč pro serverový certifikát (bez hesla):

  • # openssl genrsa -out server.key -rand rand.dat 1024

Teď bude potřeba vygenerovat nepodepsanou certifikační žádost:

  • # openssl req -new -days 3650 -key server.key -out server.csr

V žádosti je potřeba vyplnit některé údaje stejně jako u CA (tj. countryName a stateOrProvinceName) a údaj "Common Name" již musí obsahovat doménu vašeho https serveru. Pokud máte vše splněno, zbývá vám už jen dle žádosti vygenerovat certifikát podepsaný vaší CA:

  • # openssl ca -days 3650 -in server.csr -keyfile ca.key -cert ca.pem -out server.pem

Pokud je vše v pořádku, nástroj se vás zeptá:

  • # Sign the certificate? [y/n]:y
  • # 1 out of 1 certificate requests certified, commit? [y/n]:y

Tímto je vše hotovo. Na certifikáty se můžete podívat:

  • # openssl x509 -in ca.pem -text
  • # openssl x509 -in server.pem -text

Obsah klíčů si můžete taky zobrazit:

  • # openssl rsa -in ca.key -text
  • # openssl rsa -in server.key -text

V adresáři ./pokus/demoCA se zapsaly do souborů nějaké hodnoty (jde o informace vystavení a podepsání certifikátů naší CA) a v adresáři ./pokus/demoCA/newcerts máte kopii vašeho podepsaného certifikátu. Certifikát serveru použijete pro správný chod Apache serveru a certifikát CA budete poskytovat klientům pro bezproblémové připojení.

Formáty certifikátů DER a PEM

Ve výchozím nastavení Openssl se certifikáty generují ve formátu PEM. Serverové certifikáty se musí generovat jako PEM a podepsané musí být zase certifikátem PEM, ale self-signed certifikáty se můžou generovat i ve formátu DER. Pokud potřebujete certifikát převést z jednoho formátu do druhého, stačí na to jeden řádek:

  • # openssl x509 -inform pem -outform der -in ca.pem -out ca.crt

A naopak:

  • # openssl x509 -inform der -outform pem -in ca.crt -out ca.pem

Konfigurace Apache serveru

V každém distru se povoluje SSL modul jinak, proto vypíchnu jen ty nejdůležitější věci, které jsou pro všechny Apache společné. V konfiguraci Apache serveru musíte povolit nahrávání SSL modulu, v každé verzi se jmenuje jinak:

  • Apache 1.3.x - libssl.so
  • Apache 2.x.x - mod_ssl.so

Poté musíte nastavit tomuto SSL hodnoty stejným způsobem jako u default konfigurace Apache (vše je vžy připraveno, pouze cesty editujte):

  • <VirtualHost _default_:443>
  • DocumentRoot "/cesta/k/vasim/datum"
  • ServerName vase.https.domena.cz:443
  • SSLEngine on
  • SSLCertificateFile /cesta/k/vasemu/server.pem
  • SSLCertificateKeyFile /cesta/k/vasemu/server.key
  • ......
  • <VirtualHost>

Upozorňuji, že u SSL modulu nefunguje jednoportový virtuální name-based hosting, zprovoznit na jednom portu lze pouze jeden name-based virtuální server s jedním certifikátem vystaveným na jednu doménu.

Pokud vše pracuje korektně, klient si certifikát CA naimportuje do prohlížeče a bez jakýchkoliv potíží se připojí k vašemu https serveru. Samozřejmě krok importu je pro většinu uživatelů nepřekonatelný, proto jestli spravujete komerční server, bude jistě pohodlnější (a také dražší) si nechat certifikát podepsat nějakou komerční CA, která již má svůj certifikát v databázích nejpouživanějších prohlížečů (Mozilla Firefox, Internet Explorer).

 
Mendelovo gymnázium | Designed by webmaster | Powered by Joomla | Creative Commons Attribution