Lets Encrypt + Nginx + CentOS 7 + автоматическое обновление

letsencrypt-nginxssl

Большая часть мануала стырена отсюда: https://hellsman.ru/admin/linux/ustanovka-ssl-sertifikata-ot-letsencrypt-s-nginx-v-centos-7

Но у меня на одном сервере крутятся много доменов и поэтому мы его немного модифицируем, чтобы каждому серверу соответствовал свой сертификат.

Приступим.

Все действия должны выполняться на сервере, где располагается сайт. Т.е. по команде nslookup domain.com должен возвращаться именно IP-адрес вашего сервера, на котором будут выполняться дальнейшие действия. Это очень важно!

Первое что нужно сделать — получить сам клиент для связи с удостоверяющим сервером Let’s Encrypt.

cd /usr/src

git clone https://github.com/letsencrypt/letsencrypt && cd letsencrypt

Для корректной работы нам нужно отключить nginx. Собственно это самый неприятный момент, пока мы будем получать сертификат, сайт будет недоступен. Но благо это занимает буквально 1-2 минуты.

service nginx stop

Получаем сертификат:

./letsencrypt-auto certonly -d domain.com -d www.domain.com –server https://acme-v01.api.letsencrypt.org/directory

Далее скрипт произведет установку всех необходимых библиотек, затем предложит согласиться с правилами использования и последним этапом будет запрос на ввод адреса эл.почты.

После генерации будет выведено сообщение об успешном получении SSL-сертификата.

Данную команду надо выполнить для каждого домена. Так как wildcard пока нельзя, то перечисляем все домены (включая третий и глубже уровни) по порядку.

Сертификаты находятся в папке /etc/letsencrypt/live/domain.com/

Проверяем что сертификат был сформирован правильно:

openssl x509 -noout -text –in /etc/letsencrypt/live/domain.com/cert.pem / grep DNS

На выходе мы получаем перечень DNS-имен на которые выписан сертификат.

  1. DNS:domain.com
  2. DNS:www.domain.com

Ну и проверяем корректность того, что правильно прописан центр сертификации:

openssl x509 -noout -text –in /etc/letsencrypt/live/stat.hellsman.ru/cert.pem | grep Issuer

Вы должны получить следующие строки:

  1. Issuer: C=US, O=Let‘s Encrypt, CN=Let’s Encrypt Authority X1
  2. CA Issuers – URI:http://cert.int-x1.letsencrypt.org/

Обратите внимание, что сертификат выдается на 90 (!!!) дней. Через 90 дней нужно будет перевыпустить SSL-сертификат, выполнив тот же запрос с помощью клиента Let’s Encrypt.

Теперь дело остается за малым, настраиваем Nginx:

nano /etc/nginx/conf.d/ssl.conf

и вставляем туда следующее:

 

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS +RC4 RC4";

ssl_session_cache shared:SSL:10m;
add_header Strict-Transport-Security “max-age=31536000;”;
resolver 8.8.8.8 8.8.4.4 valid=300s;
ssl_stapling on;
ssl_stapling_verify on;
resolver_timeout 10s;
spdy_keepalive_timeout 300;
spdy_headers_comp 9;

Теперь в web-site.conf пишем остатки:

server {
 listen 80;
 server_name domain.com www.domain.com;

 #always redirect HTTP to HTTPS
 return 301 https://$host$request_uri;
}
server {
    listen 443 default_server ssl;
 server_name domain.com www.domain.com;
#SSL
 ssl on;
 ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
 ssl_dhparam /etc/letsencrypt/live/domain.com/dhparam.pem;
}

Последней строкой в конфигурации прописан параметр ssl_dhparam. Данная настройка позволяет указать файл параметров для протокола обмена ключами Диффи — Хеллмана. В данном файле мы обязываем клиентов использовать криптоустойчивые ключи длиной 4096 байт и запрещаем понижать длину ключа. Но по умолчанию данный файл не генерируется, его нужно создать. Делается это следующей командой

openssl dhparam -out /etc/letsencrypt/live/domain.com/dhparam.pem 4096

С настройкой Nginx покончено, теперь нужно разрешить внешние подключения к порту 443, который используется nginx для HTTPS-соединений.

firewall-cmd --permanent --zone=public --add-port=443/tcp
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

Собственно на этом настройка закончена. Проверяем правильность файла конфигурации и запускаем Nginx

nginx -t

service nginx start

Проверяем что сайт доступен и перенаправляет всех посетителей с HTTP на HTTPS: http://domain.com -> https://domain.com

На этом собственно настройка nginx закончена, а теперь настала пора автоматизации получения ключей каждые два месяца, соответственно рекомендации LetsEncrypt

во-первых, создаём в какой-то более-менее защищённой папке скрипт renew.sh

cd /usr/src/letsencrypt
service nginx stop
./letsencrypt-auto –renew certonly -d domain.com -d www.domain.com –server https://acme-v01.api.letsencrypt.org/directory
service nginx start

затем chmod +x renew.sh его.

По умолчанию, редактором кронтаб является vi, который я терпеть ненавижу. Поэтому, для тех, кто со мной солидарен, есть волшебная команда export EDITOR=nano, где nano — ваш предпочитаемый редактор.

Затем, редактируем crontab — crontab -e — и вставляем туда строку:

0 0 1 */2 * /path_to_script/renew.sh > /var/log/letsencryptrenew.log

Перезапускаем крон

service crond restart

Данная настройка будет запускать скрипт по первым числам каждого нечётного месяца и складывать вывод в файл с логом.

 

Leave a Reply