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
- zadáme email
- souhlasíme s podmínkami
- 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