Большая часть мануала стырена отсюда: 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-имен на которые выписан сертификат.
- DNS:domain.com
- DNS:www.domain.com
Ну и проверяем корректность того, что правильно прописан центр сертификации:
openssl x509 -noout -text –in /etc/letsencrypt/live/stat.hellsman.ru/cert.pem | grep Issuer
Вы должны получить следующие строки:
- Issuer: C=US, O=Let‘s Encrypt, CN=Let’s Encrypt Authority X1
- 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
Данная настройка будет запускать скрипт по первым числам каждого нечётного месяца и складывать вывод в файл с логом.