Jak jsem nasadil Let’s Encrypt

Dnes si prakticky ukážeme jak zprovoznit Let’s Encrypt na vlastním serveru s Debianem a Apache. Let’s Encrypt je továrna na certifikáty zdarma.

Instalace Let’s Encrypt

git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

Zastavíme Apache

/etc/init.d/apache2 stop
#nebo

systemctl stop apache2.service

Přesvědčíme se že na portu 80 nic neposlouchá:

netstat -na | grep ':80.*LISTEN'

Vygenerování certifikátu

cd /opt/letsencrypt
./letsencrypt-auto certonly --standalone
  1. zadáme email
  2. souhlasíme s podmínkami
  3. zadáme doménová jména pro která chceme certifikát (example.com, www.example.com, app.example.com)
IMPORTANT NOTES:
 - If you lose your account credentials, you can recover through
   e-mails sent to vencax@gmail.com.
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/www.meducina.cz/fullchain.pem. Your cert will
   expire on 2016-04-14. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.
 - Your account credentials have been saved in your Let's Encrypt
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Let's
   Encrypt so making regular backups of this folder is ideal.
 - If you like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Opět spustíme Apache

/etc/init.d/apache2 start

Certifikáty byly vytvořeny do složky:

ls -al /etc/letsencrypt/live/www.your_domain_name.com

Do Apache pak stačí pouze přidat (základní nejjdnodužší nastavení):

vim meducina.cz-ssl.conf:

<VirtualHost *:443>
    ServerAdmin webhosting@ukaztese.cz
    ServerName  meducina.cz
    ServerAlias *.meducina.cz
    DocumentRoot /var/www/meducina.cz/web/www/www

    SSLEngine on
    SSLCertificateFile "/etc/letsencrypt/live/www.meducina.cz/cert.pem"
    SSLCertificateKeyFile "/etc/letsencrypt/live/www.meducina.cz/privkey.pem"
</VirtualHost>

Přidáme tuto konfiguraci:

cd /etc/apache2/sites-enabled
a2ensite meducina.cz-ssl

Restartovat Apache a je to 🙂

Ovšem doporučuji Apache nastavit pořádně. K tomu pomůže Generator Mozilla Security (musel jsem povolit a2enmod headers). Takto mi to funguje

#Listen 443
<VirtualHost *:443>
    ServerAdmin webhosting@ukaztese.cz
    ServerName  meducina.cz
    ServerAlias *.meducina.cz
    DocumentRoot /var/www/meducina.cz/web/www/www

    SSLEngine on
    SSLCertificateFile      "/etc/letsencrypt/live/www.meducina.cz/cert.pem"
    SSLCertificateKeyFile   "/etc/letsencrypt/live/www.meducina.cz/privkey.pem"
    SSLCACertificateFile    "/etc/letsencrypt/live/www.meducina.cz/fullchain.pem"

    # HSTS (mod_headers is required) (15768000 seconds = 6 months)
    Header always set Strict-Transport-Security "max-age=15768000"
</VirtualHost>



# intermediate configuration, tweak to your needs
SSLProtocol             all -SSLv3
SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
SSLHonorCipherOrder     on
    SSLCompression          off
#    SSLSessionTickets       off   #WTF - why don't work?

    # OCSP Stapling, only in httpd 2.3.3 and later
    SSLUseStapling          on
    SSLStaplingResponderTimeout 5
    SSLStaplingReturnResponderErrors off
SSLStaplingCache        shmcb:/var/run/ocsp(128000)

Přesměrování na https

Veškerý traffic přesměrujeme na http

<VirtualHost *:80>

#...
    #redirect to https
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
#...

</VirtualHost>

 

Obnova certifikátů

Doporučuji si udělat symlink aby příkaz letsencrypt-auto fungoval kdekoliv z příkazové řádky:

ln -s /opt/letsencrypt/letsencrypt-auto /usr/local/bin/letsencrypt-auto

Certifikáty jsou vystavené pouze s platností 90 dnů! Zároveň je doporučováno je každých 60 dnů obnovit. Aktualizace certifikátů zatím stále není k dispozici, ale certifikát obnovíme opětovným spuštěním příkazů uvedených výše.

 

Pravidelná aktualizace certifikátů

Abychom nemuseli myslet na pravidelnou aktualizaci certifikátů, přidáme záznam do cornu, který nám je bude automaticky aktualizovat:

crontab -e

Obnovu certifikátů budeme spouštět každý první den v sudém měsíci ve 4:00 ráno:

0 4 1 */2 * cd /opt/letsencrypt && ./letsencrypt-auto certonly --apache --renew-by-default --apache -d www.meducina.cz >> /var/log/letsencrypt/meducina.cz-renew.log 2>&1
0 4 1 */2 * cd /opt/letsencrypt && ./letsencrypt-auto certonly --apache --renew-by-default --apache -d www.vhazovani.cz >> /var/log/letsencrypt/meducina.cz-renew.log 2>&1
0 4 1 */2 * letsencrypt-auto certonly --apache --renew-by-default --apache -d www.protivinsko.cz >> /var/log/letsencrypt/protivinsko.cz-renew.log 2>&1

To je vše. Není nutné restartovat Apache

Ovšem lepší je dát do cronu pouze 1 script, který bude automaticky obnovovat certifikáty:

0 4 1 */2 * /root/letsencrypt-renew

vim /root/letsencrypt-renew

#!/bin/bash

/opt/letsencrypt/letsencrypt-auto certonly --apache --renew-by-default --apache -d www.meducina.cz >> /var/log/letsencrypt/meducina.cz-renew.log 2>&1

/opt/letsencrypt/letsencrypt-auto certonly --apache --renew-by-default --apache -d www.vhazovani.cz >> /var/log/letsencrypt/vhazovani.cz-renew.log 2>&1

/opt/letsencrypt/letsencrypt-auto certonly --apache --renew-by-default --apache -d www.protivinsko.cz >> /var/log/letsencrypt/protivinsko.cz-renew.log 2>&1

/opt/letsencrypt/letsencrypt-auto certonly --apache --renew-by-default --apache -d www.mamejidlo.cz >> /var/log/letsencrypt/mamejidlo.cz-renew.log 2>&1

Nastavit oprávnění pro spouštění:

chmod oug+x letsencrypt-renew