Ещё один блог о системном администрировании, операционных системах, СУБД, сетях, костылях-велосипедах и пр.
Let's Encrypt это новый центр сертификации (CA), который позволяет любому желающему простым способом бесплатно получить и установить SSl-сертификат для своего домена и перевести сайт или сервис на HTTPS. Сайт проекта - letsencrypt.org
В этой заметке я попробую описать весь процесс по генерации и установке сертификата, настройке сайта, работающего на Nginx и CentOS7. Но я думаю, что большая часть этой статьи будет актуальна для любого дистрибутива Linux.
Так же необходимо отметить, что сертификаты от Let's Encrypt выдаются на 90 дней. По истечении этого срока необходимо будет перевыпустить SSL-сертификат. Тут же будет описана настройка автоматического обновления сертификата.
Приступим. Первым делом необходимо получить с GitHub клиент для связи с удостоверяющим сервером Let’s Encrypt:
# git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
Если на сервере не установлен git, то:
# yum install git
Для успешной работы необходимо отключить Nginx. Это единственный неприятный момент - пока будем получать сертификат, сайт будет недоступен. Хорошо, что процедура занимает буквально 5-7 минут.
# systemctl stop nginx
Далее перейдем в каталог /opt/letsencrypt и запустим скрипт генерации сертификатов:
# cd /opt/letsencrypt
# ./letsencrypt-auto certonly -d mydomain.com -d www.mydomain.com
Cкрипт установит необходимые для работы пакеты, затем появится следующее окно:
Выбираем пункт номер 2 Automatically use a temporary webserver (standalone) и жмем OK. Далее попросят ввести адрес элекронной почты:
Соглашаемся с лицензионным соглашением (вы ведь его прочитали, правда):
После генерации будет выведено сообщение об успешном получении SSL-сертификата:
IMPORTANT NOTES:
- If you lose your account credentials, you can recover through
e-mails sent to vadim.cojuhar@gmail.com.
- Your account credentials have been saved in your Certbot
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 Certbot so
making regular backups of this folder is ideal.
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/mydomain.com/fullchain.pem. Your cert will
expire on 2016-11-23. To obtain a new or tweaked version of this
certificate in the future, simply run letsencrypt-auto again. To
non-interactively renew *all* of your certificates, run
"letsencrypt-auto renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Как видно из этого сообщения сертификаты находятся в папке /etc/letsencrypt/live/mydomain.com/
В целях дальнейшего повышения уровня безопасности, сгенерируем ключ по алгоритму шифрования Диффи-Хеллмана. Делается это следующей командой:
# openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
Генерация файла может занять продолжительное время, но без него получить оценку A+ в тесте безопасности SSL практически не возможно.
Настройка конфигурации Nginx:
server {
# перенаправляем с 80 порта на 443
server_name mydomain.com www.mydomain.com
listen 80;
return 301 https://www.mydomain.com$request_uri;
}
server {
listen 443 ssl;
server_name mydomain.com www.mydomain.com;
# Указываем пути к сертификатам
ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers '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';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
# позволяем серверу прикреплять OCSP-ответы, тем самым уменьшая время загрузки страниц у пользователей
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
location / {
.....
}
}
Не забываем открыть в файерволе 443 порт. Для firewalld:
# firewall-cmd --permanent --zone=public --add-port=443/tcp
# firewall-cmd --permanent --zone=public --add-service=https
# firewall-cmd --reload
Для iptables:
# iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
Проверим правильность конфигурации и запустим Nginx:
# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# systemctl start nginx
Теперь осталось проверить в браузере доступность нашего сайта и то, что перенаправление всех посетителей с HTTP на HTTPS работает. На этом настройка закончена.
Как я уже говорил, сертификаты действительный 90 дней. Их рекомендуется продливать каждые 60 дней. Для запуска процесса обновления сертификатов всех установленных доменов необходимо выполнить команду:
# /opt/letsencrypt/letsencrypt-auto renew
Так как сертификат установлен недавно, команда проверит дату истечения срока действия и распечатает сообщение, информирующее о том, что сертификат не нуждается в продлении. Вы увидите примерно следующие в консоли:
Checking for new version...
Requesting root privileges to run letsencrypt...
/root/.local/share/letsencrypt/bin/letsencrypt renew
Processing /etc/letsencrypt/renewal/mydomain.com.conf
The following certs are not due for renewal yet:
/etc/letsencrypt/live/mydomain.com/fullchain.pem (skipped)
No renewals were attempted.
Для того, чтобы не запускать эту команду в ручную (да и забудем по-любому), автоматизируем это с помощью cron.
# nano /etc/crontab
Добавим строку:
0 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/cert-renew.log && /usr/bin/systemctl reload nginx
и перезапустим crond:
# systemctl restart crond
Таким образом, каждый понедельник в 2:00 будет выполняться автоматическое обновление сертификатов, после которого Nginx будет перезагружаться. Вся информация о процедуре обновления будет заноситься в лог-файл /var/log/cert-renew.log
На этом всё. Теперь ваш веб-сервер использует HTTPS и все это бесплатно!
Комментарии (RSS)
а не нужно nginx останавливать перед этим? у меня без остановки не пошло
Да, нужно, если делать по этой статье. Я когда писал был невнимателен.
Эта статья уже довольна старая. У letsencrypt теперь есть плагин для nginx. И теперь его не надо останавливать. Достаточно выполнить после обновления сертификатов nginx -s reload
можно сказать получилось