Tento článek je pouze drobnou úpravou návodu The Apache + SSL on Win32 HOWTO. Věnuje se serveru Apache 1.3.x (testoval jsem na verzi 1.3.33), i když je dnes doporučeno používat verzi Apache 2.x. Návod je popisován při použití balíku EasyPHP 1.8 (Apache, MySQL, PHP, phpMyAdmin), ale pro samostatný Apache je vše téměř stejné. Provoz jsem zkoušel na Windows XP a Windows Server 2003.
1. instalace Apache - EasyPHP
Instalace EasyPHP je velmi jednoduchá. V popisu budu vycházet z toho, že jsme jej nainstalovali do adresáře c:\easyphp
.
EasyPHP nalezneme na adrese http://easyphp.org/. Samostatný Apache na http://httpd.apache.org/.
Stručný popis EasyPHP je v článku Apache, MySQL, PHP - EasyPHP a základní konfigurace Apache Konfigurace Apache a PHP.
Můžeme otestovat, že nám web server chodí tím, že z internetového prohlížeče přistoupíme na adresu http://localhost/.
Konfigurace portu pro SSL
Protokol http používá defaultně port 80 a protokol https (tedy HTTP přes SSL) port 443.
Upravíme konfiguraci Apache (soubor httpd.conf) tím, že klikneme pravým tlačítkem na ikonu EasyPHP ve stavové liště a zvolíme Configuration - Apache.
- najdeme řádek
Port 80
a zakomentujeme#Port 80
(místo portu budeme používat Listen) - najdeme řádek
Listen 127.0.0.1:80
(poslouchá pouze z lokálu a port 80), ten zakomentujeme a přidámeListen 80
(pokud chceme, aby fungovalo klasické HTTP) aListen 443
(pro HTTPS) - najdeme řádek
ServerName localhost
a localhost zaměníme za DNS jméno serveru (nebo IP adresu), přes které budou přistupovat klienti, třebaServerName www.local
Nyní můžeme otestovat, že server běží na portu 443 (pořád, ale neběží SSL) http://localhost:443/
2. OpenSSL a mod_ssl
Z adresy hunter.campbus.com stáhneme poslední verzi Apache s mod_ssl (nyní to je Apache_1.3.37-Mod_SSL_2.8.28-Openssl_0.9.8b-Win32.zip) a OpenSSL pro Windows (Openssl-0.9.8d-Win32.zip). Oba archívy rozbalíme do dočasných složek.
Z adresáře OpenSSL zkopírujeme knihovny ssleay32.dll
a libeay32.dll
, buď do Windows\System32
, což není doporučováno, pokud provozujete více aplikací, které používají tyto knihovny (každá aplikace potřebuje jinou verzi), ale jednoduše funguje, nebo do adresáře s EasyPHP, ale je třeba ošetřit cesty.
3. Vytvoření serverového certifikátu
Aby mohlo SSL fungovat, tak musí mít server certifikát. Pro testování můžeme vydat neověřený certifikát - self-signed (možnost A), ale pro provozní prostředí je určitě lepší certifikát od veřejné autority nebo od firemní CA (možnost B).
Pro certifikáty ve spolupráci s Apachem můžeme použít OpenSSL. Pro OpenSSL potřebujeme konfigurační soubor, můžeme použít openssl.cnf, který funguje beze změny.
- Nejprve musíme vytvořit žádost (v obou případech) a privátní klíč. Příkaz vytvoří žádost
server.req
spolu s privátním klíčemprivkey.pem
. Musíme zadat několik hodnot, jako heslo a hodnoty, které se zobrazí v certifikátu. Nejdůležitější je Common Name, kam zadáme adresu našeho serveru, třebawww.local
.
openssl req -config openssl.cnf -new -out server.req
- V dalším kroku musíme odstranit z privátního klíče passphrase, aby k němu mohl přistupovat Apache. Měli bychom tedy zajistit, aby se k souboru dostal pouze Apache server a administrátor.
openssl rsa -in privkey.pem -out server.key
- Dále již vytváříme vlastní certifikát ze žádosti. V případě B použijeme náš administrační nástroj CA pro vytvoření certifikátu. V případě A použijeme následující příkaz, v parametru
days
můžeme specifikovat délku platnosti.
openssl x509 -in server.req -out server.cer -req -signkey server.key -days 365
- Vytvořený certifikát je ve formátu Base-64 encoded x.509, potřebném pro Apache. Windows (hlavně starší) preferují formát DER encoded x.509. Pomocí OpenSSL můžeme převádět formáty mezi sebou.
openssl x509 -in server.cer -out server.der.cer -outform DER
Na závěr musíme nakopírovat certifikát (server.cer) a privátní klíč (server.key) do nově vytvořené složky c:\easyphp\apache\conf\ssl
.
4. Konfigurace Apache s mod_ssl
- Zastavíme Apache (pomocí rozhranní EasyPHP nebo vypneme celé EasyPHP).
- Z adresáře, kam jsme si rozbalili stažený Apache s mod_ssl, zkopírujeme všechny soubory
*.exe, *.dll, *.so
(měly by se nacházet v podadresářích bin, modules a v rootu složky) do adresářec:\easyphp\apache
, včetně podsložek a vše přepíšeme. Jsou to soubory, které jsou zkompilovány s podporou mod_ssl (asi nejsou potřeba všechny, ale netestoval jsem to). - V konfiguraci Apache (httpd.conf, pomocí rozhranní EasyPHP) přidáme do sekce LoadModule
LoadModule ssl_module modules/mod_ssl.so
- a do sekce AddModule
AddModule mod_ssl.c
- a nakonec souboru doplníme informace o certifikátu a SSL. Řádek SSLLogLevel můžeme po otestování změnit na warn, aby se do logu nezapisovalo tolik informací. Do VirtualHost musíme zadat správné jméno serveru.
SSLMutex sem SSLRandomSeed startup builtin SSLSessionCache none SSLLog logs/SSL.log SSLLogLevel info <VirtualHost www.local:443> SSLEngine On SSLCertificateFile conf/ssl/server.cer SSLCertificateKeyFile conf/ssl/server.key </VirtualHost>
- nastartujeme Apache a vše by mělo fungovat
Nyní již můžeme vyzkoušet přistoupit na stránku přes SSL https://localhost/
Poznámky
Upozornil bych na několik problémů, s kterými jsem se setkal, a které mohou vést k tomu, že Apache nenastartuje.
- správná jména serveru (adresa) ve VirtualHost, ServerName a CommonName u certifikátu, pro testování můžeme všude používat
localhost
- pod VirtualHost odkaz na správný certifikát (cesta a jméno)
- certifikát ve správném formátu Base-64 encoded
Do souboru error.log
Apache serveru se zapisuje varování
[warn] Loaded DSO C:/EasyPHP/php/php4apache.dll uses plain Apache 1.3 API, this module might crash under EAPI! (please recompile it with -DEAPI)
Nepodařilo se mě nikde sehnat takto zkompilovaný soubor nebo nějaké řešení. Ale vše běží v pořádku i s tímto varováním.
Řeším to také.
taky to řeším, takže vítám, že jsem to našel všechno v kupě
Dnes již používám WAMP www.wampserver.com, kde je vše předpřipraveno a funguje velmi dobře po krátké konfiguraci.
10 let po vydání článku a stále pomohl! :) (jasný, easyphp si trochu stěžovalo na nějaké už nepodporované direktivy, ale nic co by se nedalo natipovat) Díky!