Let’s Encrypt certifikát (téměř) automaticky

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.

1. Příprava

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.

2. Získání 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 😉 )

3. Nastavení Apache

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

4. Automatizace

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

5. Profit!

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:

Výběr_001

Zdroje