Записки системного администратора

Ещё один блог о системном администрировании, операционных системах, СУБД, сетях, костылях-велосипедах и пр.

CentOS 7: Установка SSL-сертификата от Let's Encrypt для Nginx

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)

Добавим строку:

0 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/cert-renew.log && /usr/bin/systemctl reload nginx

а не нужно nginx останавливать перед этим? у меня без остановки не пошло

Ответить Отменить ответ

Да, нужно, если делать по этой статье. Я когда писал был невнимателен.

Эта статья уже довольна старая. У letsencrypt теперь есть плагин для nginx. И теперь его не надо останавливать. Достаточно выполнить после обновления сертификатов nginx -s reload

Ответить Отменить ответ

HTML Preview:

Коротко о себе:

Привет! Меня зовут Вадим. В этом блоге я пишу об интересующих меня вещах, о проблемах, с которыми сталкиваюсь во время работы, и о путях их решения.

Связаться со мной можно, написав письмо на адрес vadim@adminbook.click