1.Установка Let’s Encrypt
При использовании Nginx в качестве Web-сервера
Установка git
Ubuntu/Debian
1 |
# apt-get install git |
Centos
1 |
# yum install git |
1 |
# cd /usr/local/ |
1 |
# git clone https://github.com/letsencrypt/letsencrypt |
1 |
# cd /usr/local/letsencrypt/ |
Остановка Nginx, который прослушивает 80 порт.
Перед генерацией сертификатов необходимо убедиться, что все имена домена(включая www-поддомен ,если он должен быть включен в сертификат), для которых генерируются сертификаты имеют запись типа А в ДНС.
Также необходимо остановить службу, которая слушает 80 порт на время генерирования сертификата(например, Nginx)
Ubuntu 14, Centos 6
1 |
# service nginx stop |
Debian 8, Centos 7
1 |
# systemctl stop nginx |
2.Генерирование SSL-сертификатов, например.для сайтов kamaok.org.ua и example.com
1 |
# ./letsencrypt-auto certonly --standalone -d kamaok.org.ua -d www.kamaok.org.ua |
1 |
# ./letsencrypt-auto certonly --standalone -d example.com -d www.example.com |
После успешной генерации сертификатов запускаем Nginx
1 |
# service nginx start |
Либо
1 |
# systemctl start nginx |
В каталоге /etc/letsencrypt/live/ будут созданы каталоги с именами доменов, на которые генерировались сертификаты
1 |
# ls -l /etc/letsencrypt/live/ |
1 2 3 |
total 8 drwxr-xr-x 2 root root 4096 Apr 8 22:03 kamaok.org.ua drwxr-xr-x 2 root root 4096 Apr 8 22:03 example.com |
1 |
# ls -l /etc/letsencrypt/live/*/ |
1 2 3 4 5 6 |
/etc/letsencrypt/live/kamaok.org.ua/: total 0 lrwxrwxrwx 1 root root 37 Apr 8 22:03 cert.pem -> ../../archive/ kamaok.org.ua /cert1.pem lrwxrwxrwx 1 root root 38 Apr 8 22:03 chain.pem -> ../../archive/kamaok.org.ua/chain1.pem lrwxrwxrwx 1 root root 42 Apr 8 22:03 fullchain.pem -> ../../archive/kamaok.org.ua/fullchain1.pem lrwxrwxrwx 1 root root 40 Apr 8 22:03 privkey.pem -> ../../archive/kamaok.org.ua/privkey1.pem |
1 2 3 4 5 6 |
/etc/letsencrypt/live/example.com /: total 0 lrwxrwxrwx 1 root root 45 Apr 8 22:03 cert.pem -> ../../archive/example.com /cert1.pem lrwxrwxrwx 1 root root 46 Apr 8 22:03 chain.pem -> ../../archive/ example.com /chain1.pem lrwxrwxrwx 1 root root 50 Apr 8 22:03 fullchain.pem -> ../../archive/ example.com /fullchain1.pem lrwxrwxrwx 1 root root 48 Apr 8 22:03 privkey.pem -> ../../archive/ example.com /privkey1.pem |
3.Настройка Nginx на поддержку SSL
1 |
# cat /etc/nginx/ssl.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
ssl_session_cache shared:SSL:20m; ssl_session_timeout 1d; ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+A ES:RSA+3DES:!aNULL:!MD5:!DSS; ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; ssl_dhparam /etc/nginx/ssl/dhparam.pem; # ssl_ecdh_curve secp521r1; ## Improves TTFB by using a smaller SSL buffer than the nginx default ssl_buffer_size 8k; ## Enables OCSP stapling ssl_stapling on; resolver 8.8.8.8; ssl_stapling_verify on; ## Send header to tell the browser to prefer https to http #add_header Strict-Transport-Security max-age=31536000; |
1 |
# mkdir /etc/nginx/ssl |
Генерация ключа Диффи-Хельмана
1 |
# openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048 |
1 |
# nano /etc/nginx/sites-enabled/kamaok.org.ua |
1 2 3 4 5 6 7 |
server { ....... ssl_certificate /etc/letsencrypt/live/kamaok.org.ua/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/kamaok.org.ua/privkey.pem; include /etc/nginx/ssl.conf; ....... } |
1 |
# nginx -t && service nginx restart |
Если необходима принудительное перенаправление с http на https
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
server { listen <EXTERNAL_IP>:80; server_name kamaok.org.ua www.kamaok.org.ua; return 301 https://$host$request_uri; } server { listen <EXTERNAL_IP>:443 ssl; server_name kamaok.org.ua www.kamaok.org.ua; ssl_certificate /etc/letsencrypt/live/kamaok.org.ua/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/kamaok.org.ua/privkey.pem; include /etc/nginx/ssl.conf; ……………………… } |
1 |
# nginx -t && service nginx restart |
4.Проверка сертификата SSL-настроек
https://www.ssllabs.com/ssltest/
5.Настройка автоматического продления сертификата
Создаем скрипт для автоматического продления сертификата для КОНКРЕТНОГО домена/подддомена
1 |
# nano /usr/local/bin/ssl-renew.sh |
1 2 3 4 5 6 7 8 |
# cd /usr/local/letsencrypt ./letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=/path/to/documentroot -d example.org -d www.example.org ./letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=/path/to/documentroot -d kamaok.org.ua -d www.kamaok.org.ua # Ubuntu14, Centos 6 service nginx reload # Debian 8, Centos 7 # systemctl reload nginx exit 0 |
Если корень сайта закрыт базовой аутентификацией,то разрешаем доступ каталогу .well-known в корне сайта без аутентификации, добавляя в виртуальный хост сайта в Nginx
1 2 3 |
location ~ /.well-known { allow all; } |
Автоматическое продление сертификатов для ВСЕХ ДОМЕНОВ, использующих LetsEncrypt
1 2 3 4 5 |
# Debian 8, Centos 7, Ubuntu 16 cd /usr/local/letsencrypt && systemctl stop nginx && ./letsencrypt-auto renew; systemctl start nginx # Ubuntu14, Centos 6 # cd /usr/local/letsencrypt && service stop nginx && ./letsencrypt-auto renew; service start nginx exit 0 |
1 |
# chmod +x /usr/local/bin/ssl-renew.sh |
Добавляем скрипт в cron на выполнение раз в месяц (сертификат выдается на срок 3 месяца)
1 |
# crontab -e |
1 |
0 1 1 * * /usr/local/bin/ssl-renew.sh >> /var/log/letsencrypt/ssl-renew.log 2>&1 |
В качестве альтернативного типа аутентификации и установки сертификата вместо режима standalone,
который требует остановки WEB-сервера на время получения/продления сертификата можно использовать режим/плагин nginx,который не требует остановки WEB-сервера(Nginx)
Получение сертификата для домена example.com и поддомена www.example.com для Nginx-сервера
1 |
# ./letsencrypt-auto certonly --nginx -d example.org -d www.example.org |
Если использовать подкоманду certonly, то сертификат будет только получен(но не установлен в Web-сервер)
Это удобно,когда мы самостоятельно настраиваем WEB-сервер и не хотим,чтобы Let’sEncrypt изменял файлы нашего Web-сервера
Если не указывать подкоманду certonly, тогда по умолчанию выполняется команда run, которая получает и УСТАНАВЛИВАЕТ сертификат для нашего WEB-сервера
Для включение/отключение force-redirect http->https используем опции
1 2 |
--redirect --no-redirect |
1 |
# ./letsencrypt-auto --no-redirect --nginx -d example.org -d www.example.org |
1 |
# ./letsencrypt-auto --redirect --nginx -d example.org -d www.example.org |
По умолчанию(если не указывать соотвествующие опции) будет запрос о включении ли принудительного перенаправления
Принудительное обновление сертификата (—force-renewal)
1 |
# ./letsencrypt-auto --force-renewal --nginx -d example.org -d www.example.org |
Также добавим ключ —noninteractive для автоматического обновления сертификатов без запросов на ввод данных вручную(если каких-либо параметров будет не хватать/недостаточно, то let’sencrypt сообщит об этом)
Продление всех сертификатов
Принудительное автоматическое обновление сертификатов для ВСЕХ ДОМЕНОВ без остановки web-сервера Nginx
1 |
# cd /usr/local/letsencrypt && ./letsencrypt-auto renew --nginx --no-redirect --noninteractive --force-renewal; nginx -t && service nginx reload |
Добавим в планировщик cron задание по продлению всех сертификатов каждые 60 дней(сертификат выдается на срок 90 дней)
1 |
# crontab -e |
1 |
0 1 1 */2 * /usr/local/bin/ssl-renew.sh >> /var/log/letsencrypt/ssl-renew.log |
1 |
# nano /usr/local/bin/ssl-renew.sh |
1 2 3 4 |
#!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin cd /usr/local/letsencrypt && ./letsencrypt-auto renew --nginx --no-redirect --noninteractive --force-renewal; nginx -t && service nginx reload |
1 |
# chmod +x /usr/local/bin/ssl-renew.sh |
Тестирование автообновления всех сертификатов( опция —dry-run)
1 |
# cd /usr/local/letsencrypt && ./letsencrypt-auto renew --nginx --no-redirect --noninteractive --force-renewal --dry-run |
Другие полезные команды
Изменение Email-адреса, указанного при регистрации(создании аккаунта)
1 |
# ./letsencrypt-auto register --update-registration --email name@mydomain.com --no-eff-email |
Просмотр выданных LetsEncrypt-сертификатов
1 |
# ./letsencrypt-auto certificates |
Вместо файла letsencrypt-auto – bash-скрипта, которые запускает последнюю версию Certbot клиента можно устнаовить и использовать непосредственно бинарник certbot
Например,установка на Ubuntu16.04
1 |
# apt-get install software-properties-common |
1 |
# add-apt-repository ppa:certbot/certbot |
1 |
# apt-get update |
1 |
# apt-get install python-certbot-nginx |
https://certbot.eff.org/lets-encrypt/ubuntuxenial-nginx
Например,просто получить сертификат без изменения конфиг.файла Nginx
1 |
# certbot certonly --nginx -d example.org -d www.example.org --non-interactive --agree-tos --email myname@mydomain.com |
Также полезно протестировать автообновление сертификатов
1 |
# certbot renew --dry-run |
Автообновление всех сертификатов с помощью certboot
1 |
# crontab -e |
1 2 |
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 0 3 1 * * /usr/bin/certbot renew >> /var/log/letsencrypt/ssl-renew.log 2>&1 |
Поддерживаемые опции для letsencrypt-auto и certbot одинаковые
https://certbot.eff.org/docs/using.html
При использовании Apache в качестве Web-сервера
1 |
# apt-get -y install git |
1 |
# cd /usr/local |
1 |
# git clone https://github.com/letsencrypt/letsencrypt |
1 |
# cd /usr/local/letsencrypt |
1 |
# ./letsencrypt-auto --apache -d example.com -d www.example.com |
Настройка автоматического продления сертификата для конкретного домена
1 |
# crontab -e |
1 |
0 1 1 * * cd /usr/local/letsencrypt && ./letsencrypt-auto --apache -d example.com -d www.example.com >> /var/log/letsencrypt/letsencrypt-renew.log 2>&1 |
Автоматически создается файл такого содержания
1 |
# cat /etc/letsencrypt/renewal/example.com.conf |
1 2 3 4 5 6 7 8 9 10 11 12 |
# renew_before_expiry = 30 days version = 0.8.0 cert = /etc/letsencrypt/live/example.com/cert.pem privkey = /etc/letsencrypt/live/example.com/privkey.pem chain = /etc/letsencrypt/live/example.com/chain.pem fullchain = /etc/letsencrypt/live/example.com/fullchain.pem # Options used in the renewal process [renewalparams] authenticator = apache installer = apache account = 083c68e2185ab68b01b00f146cf36776 |
Если выбрали принудительное пернаправление с http на https при генерировании сертификата
В конец вирт.хоста example.com автоматически добавилось принудительное перенаправление с http на https
1 2 3 4 |
RewriteEngine on RewriteCond %{SERVER_NAME} =example.com[OR] RewriteCond %{SERVER_NAME} =www.example.com[OR] RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent] |
Также был создан файл вирт.хоста для SSL-подключений путем копирования вирт.хоста http и добавлением строк
1 2 3 4 |
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem Include /etc/letsencrypt/options-ssl-apache.conf |
Файл /etc/letsencrypt/options-ssl-apache.conf был создан автоматически Let’s Encrypt
1 |
# cat /etc/letsencrypt/options-ssl-apache.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
SSLEngine on # Intermediate configuration, tweak to your needs SSLProtocol all -SSLv2 -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: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 SSLOptions +StrictRequire # Add vhost name to log entries: LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" vhost_combined LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common #CustomLog /var/log/apache2/access.log vhost_combined #LogLevel warn #ErrorLog /var/log/apache2/error.log # Always ensure Cookies have "Secure" set (JAH 2012/1) #Header edit Set-Cookie (?i)^(.*)(;\s*secure)??((\s*;)?(.*)) "$1; Secure$3$4" |
Автоматическое продление сертификатов для ВСЕХ ДОМЕНОВ, использующих LetsEncrypt
1 |
# cd /usr/local/letsencrypt && ./letsencrypt-auto renew --apache --no-redirect --noninteractive --force-renewal; apache2ctl configtest && service apache2 reload |
Добавим в планировщик cron автообновление каждые 60 дней(сертификат выдается на срок 90 дней)
1 |
# crontab -e |
1 |
0 1 1 */2 * /usr/local/bin/ssl-renew.sh >> /var/log/letsencrypt/ssl-renew.log |
1 |
# nano /usr/local/bin/ssl-renew.sh |
1 2 3 4 |
#!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin cd /usr/local/letsencrypt && ./letsencrypt-auto renew --apache --no-redirect --noninteractive --force-renewal; apache2ctl configtest && service apache2 reload |
1 |
# chmod +x /usr/local/bin/ssl-renew.sh |
Источник:
http://www.tecmint.com/secure-nginx-with-lets-encrypt-ssl-certificate-on-ubuntu-and-debian
http://www.tecmint.com/setup-https-with-lets-encrypt-ssl-certificate-for-nginx-on-centos
http://www.cyberciti.biz/faq/how-to-configure-nginx-with-free-lets-encrypt-ssl-certificate-on-debian-or-ubuntu-linux/
http://www.tecmint.com/install-lets-encrypt-ssl-certificate-to-secure-apache-on-rhel-centos
http://www.tecmint.com/install-free-lets-encrypt-ssl-certificate-for-apache-on-debian-and-ubuntu