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