Настраиваем SSL сертификат от LetsEncrypt на Centos + Nginx

Установка SSL-сертификата от LetsEncrypt с Nginx в CentOS 7

Компания Let’s Encrypt запустила закрытый бета-тест своего сервиса. Суть которого заключается в том, что любой желающий бесплатно может получить SSL-сертификат для своего домена и перевести сайт или сервис на HTTPS. С 3 декабря 2015 года проект выходит в публичную бету.

Дальше в статье я попробую описать весь процесс по генерации и установке сертификата и настройке сайта, работающего на Nginx и CentOS7 (большая часть статьи будет актуальная для любого Linux-дистрибутива).

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

В первом поле вводим доменное имя, для которого хотим получить сертификат, во второй свой контактный e-mail. Нажимаем «Готово» и собственно все. В течение 3-5 дней на указанный адрес эл.почты придет письмо с инструкцией по установке и перечень доменов на которые вам разрешено получить SSL-сертификат.

Приступим.

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

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

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

Далее переходим в режим суперпользователя и все дальнейшие действия выполняем под ним.

sudo su

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

service nginx stop

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

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

Далее скрипт произведет установку всех необходимых библиотек, затем предложит согласиться с правилами использования и последним этапом будет запрос на ввод адреса эл.почты. В этом поле нужно ввести именно тот адрес, который был указан при регистрации в программе и тот, на который пришло письмо от Let’s Encrypt.

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

Сертификаты находятся в папке /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:

server {
 listen 80;
 server_name domain.com;
 rewrite ^ https://domain.com$request_uri? permanent;
}
server {
 server_name domain.com;
 listen 443 ssl spdy deferred;
#SSL
 ssl on;
 ssl_session_timeout 24h;
 ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_prefer_server_ciphers on;
 ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
 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;
 ssl_dhparam /etc/letsencrypt/live/domain.com/dhparam.pem;

.....
}

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

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

Генерация файла может занять продолжительное время, но без него получить оценку A+ в тесте безопасности SSL практически не возможно.

С настройкой 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

На этом собственно вся настройка закончена.