Před pár měsíci jsem se zaregistroval do beta programu Let’s Encrypt a doufal, že budu mít svůj vlastní bezplatný certifikát pro HTTPS co nejdříve. Předevčírem se podařilo a přišel mi notifikační email od Let’s Encrypt, že můžu nainstalovat svůj certifikát. Tak jsem se do toho dnes pustil! A zároveň vše popsal, třeba se to bude někomu hodit.
Nejprve je potřeba si nainstalovat některou z utilit, které umí komunikovat s letsencrypt.org servery. Celý protokol je OpenSource, takže si může kdokoliv napsat svou vlastní utilitu pro instalaci certifikátů. To se určitě bude hodit poskytovatelům webhostingů, ale já použiju oficiální letsencrypt utilitu napsanou v pythonu. Nejprve se připojím na svůj oblíbený server a přihlásím se pod uživatelem root.
$ ssh mujserver.cz
$ sudo su #(nebo jiným způsobem)
V mailu chytří pánové psali, že si mám utilitu letsencrypt naklonovat gitem:
# cd /home
# git clone https://github.com/letsencrypt/letsencrypt
# cd letsencrypt
Teď máme vše potřebné pro získání mého certifikátu.
Můžete utilitu letsencrypt spustit rovnou (# ./letsencrypt-auto) nebo se podívat na její help (# ./letsencrypt-auto --help) a vykoumat trošku složitější příkaz ke spuštění. Já jsem ji nejprve zkusil spuštění jen s parametrem --server a to nejdůležitější, co jsem zjistil bylo, že letsencrypt neumí použít mou konfiguraci apache pro ověření, že doména a server jsou opravdu mé. Toto ověření probíhá pomocí vystaveného speciálně vygenerovaného souboru pomocí webserveru (jde to i pomocí DNS, ale tím se zde zabývat nebudu) a já mám trochu speciálně nakonfigurovaný apache. Proto jsem jej musel vypnout a pustit utilitu znova. Na podruhé již trochu chytřeji.
# service apache2 stop
# ./letsencrypt-auto --agree-dev-preview --server https://acme-v01.api.letsencrypt.org/directory -d vojta.biberle.cz certonly --authenticator standalone --installer apache
# service apache2 start
Tím jsem řekl letsencrypt, aby mi pouze stáhla certifikát (certonly) a na autentizaci použila vestavěný server (--authenticator standalone) a instalaci provedla pro Apache (--installer apache). V průběhu se mě utilita ještě zeptala na email pro případné obnovení účtu (a pokud nezadáte pomocí parametru -d domény – parametr lze použít i vícekrát, tak se zeptá i na domény) A protože jsem si neporučil jinak, všechny klíče a konfiguraci uložila do složky /etc/letsencrypt. Konkrétní certifikáty do /etc/letsencrypt/live/vojta.biberle.cz. Celou tuto složku vám doporučí zazálohovat na bezpečné místo (což není jiný adresář na stejném serveru 😉 )
Teď už máme certifikáty na disku, tak hurá na nastavení Apache (jiný webserver si určitě zvládnete nastavit sami).
Nejdříve vytvoříme nový VirtualHost pro port 443:
<VirtualHost *:443>
ServerName vojta.biberle.cz
DocumentRoot /var/www/biberle.cz/vojta
<Directory /var/www/biberle.cz/vojta>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>
Dále přidáme certifikáty:
<VirtualHost *:443>
ServerName vojta.biberle.cz
DocumentRoot /var/www/biberle.cz/vojta
<Directory /var/www/biberle.cz/vojta>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
SSLEngine on
SSLProtocol all -SSLv3 -SSLv2
SSLCertificateFile /etc/letsencrypt/live/vojta.biberle.cz/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/vojta.biberle.cz/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/vojta.biberle.cz/chain.pem
</VirtualHost>
A pokud chceme na konci A+ SSL hodnocení, přidáme definici šifer:
<VirtualHost *:443>
ServerName vojta.biberle.cz
DocumentRoot /var/www/biberle.cz/vojta
<Directory /var/www/biberle.cz/vojta>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
SSLEngine on
SSLProtocol all -SSLv3 -SSLv2
SSLHonorCipherOrder on
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"
SSLCertificateFile /etc/letsencrypt/live/vojta.biberle.cz/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/vojta.biberle.cz/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/vojta.biberle.cz/chain.pem
</VirtualHost>
A pokud to chceme úplně vyšperkovat, tak ještě doplníme hlavičky:
<VirtualHost *:443>
ServerName vojta.biberle.cz
DocumentRoot /var/www/biberle.cz/vojta
<Directory /var/www/biberle.cz/vojta>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
SSLEngine on
SSLProtocol all -SSLv3 -SSLv2
SSLHonorCipherOrder on
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"
SSLCertificateFile /etc/letsencrypt/live/vojta.biberle.cz/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/vojta.biberle.cz/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/vojta.biberle.cz/chain.pem
# SPDY
Header always set Alternate-Protocol "443:npn-spdy/3"
# all to HTTPS
Header always set Content-Security-Policy "upgrade-insecure-requests"
# strict trasport security
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>
Aktivujeme VirtualHosta (a2ensite), restartujeme apache a vyzkoušíme, jestli HTTPS funguje. Musíme přímo napsat HTTPS do URL v prohlížeči, protože jsme ještě neudělali redirect z HTTP na HTTPS který můžeme udělat například takto:
<VirtualHost *:80>
ServerName vojta.biberle.cz
RewriteEngine on
RewriteRule ^ https://vojta.biberle.cz%{REQUEST_URI} [R=301,L]
</VirtualHost>
Opět restartujeme apache a mělo by být vše funkční včetně automatického přesměrování.
Sice nám před vypršením certifikátu přijde od Let’s Encrypt mail, aby jsme si jej prodloužili, ale komu by se to chtělo dělat ručně, že? Naštěstí tu máme dvě hezké vlastnosti utility letsencrypt. Pokud ji spustíme s přesně stejnými parametry, vygeneruje stejné certifikáty do stejného umístění a navíc má parametr --renew-by-default který zajistí, aby se utilita neptala na přepsání starých certifikátů. Vytvoříme si například v /home kratičký skript třeba s názvem letsencrypt-auto-renew.sh:
#!/bin/bash
/usr/sbin/service apache2 stop
/home/letsencrypt/letsencrypt-auto --agree-dev-preview --server https://acme-v01.api.letsencrypt.org/directory -d vojta.biberle.cz certonly --authenticator standalone --installer apache --renew-by-default
/usr/sbin/service apache2 start
Nastavíme mu práva na spuštění (chmod +x) a otevřeme si editaci crontabu (crontab -e) kam vepíšeme následující řádek, který zajistí, že se skript bude spouštět každý první den jednou za 3 měsíce v 3.30 ráno:
30 03 01 */3 * /home/letsencrypt-auto-renew.sh >> /home/letsencrypt-auto-renew.log
A mám na svém blogu nádherný bezplatný certifikát od zbrusu nové certifikační autority Let’s Encrypt a můžu se pochlubit touto super známkou: