Let's Encrypt предоставляет упрощенный способ получения сертификата для включения зашифрованного соединения сайтом. Получение и установка сертификата на Apache полностью автоматизирована, поэтому мы рассмотрим установку, настройку и использование Let’s Encrypt на Nginx и Ubuntu.
У Let's Encrypt также есть свои минусы. Во-первых, сертификаты выдаются всего на 90 дней. Сертификаты на более длительный срок не предусмотрены. Во-вторых, для получения сертификатов используется множество зависимостей и плагинов. Само по себе это не страшно, но когда приходится обновлять сертификат каждые 3 месяца, неизбежно появятся проблемы. Кроме всего прочего, Let's Encrypt все еще находится в активной разработке, так что баги и ошибки неизбежны.
На некоторых хостингах получение и продление сертификата автоматически, вам нужно только сделать редирект с http на https (пример Beget)
Через пару минут уже было готово
Если же нет, делаем сами
Приступим.
Все действия должны выполняться на сервере, где располагается сайт. Т.е. по команде nslookup domain.com должен возвращаться именно IP-адрес вашего сервера, на котором будут выполняться дальнейшие действия. Это очень важно!
Первое что нужно сделать — получить сам клиент для связи с удостоверяющим сервером Let’s Encrypt.
Далее переходим в режим суперпользователя и все дальнейшие действия выполняем под ним.
Для корректной работы нам нужно отключить nginx. Собственно это самый не приятный момент, пока мы будем получать сертификат, сайт будет недоступен. Но благо это занимает буквально 1-2 минуты.
Получаем сертификат:
Далее скрипт произведет установку всех необходимых библиотек, затем предложит согласиться с правилами использования и последним этапом будет запрос на ввод адреса эл.почты. В этом поле нужно ввести именно тот адрес, который был указан при регистрации в программе и тот, на который пришло письмо от Let’s Encrypt.
После генерации будет выведено сообщение об успешном получении SSL-сертификата.
Сертификаты находятся в папке /etc/letsencrypt/live/domain.com/
Проверяем что сертификат был сформирован правильно:
На выходе мы получаем перечень DNS-имен на которые выписан сертификат.
Ну и проверяем корректность того, что правильно прописан центр сертификации:
Вы должны получить следующие строки:
Сертификат выдается на 90 (!) дней. Через 90 дней нужно будет перевыпустить SSL-сертификат, выполнив тот же запрос
Теперь дело остается за малым, настраиваем Nginx:
Последней строкой в конфигурации прописан параметр ssl_dhparam. Данная настройка позволяет указать файл параметров для протокола обмена ключами Диффи — Хеллмана. В данном файле мы обязываем клиентов использовать криптоустойчивые ключи длиной 4096 байт и запрещаем понижать длину ключа. Но по умолчанию данный файл не генерируется, его нужно создать. Делается это следующей командой
Генерация файла может занять продолжительное время, но без него получить оценку A+ в тесте безопасности SSL практически не возможно.
С настройкой Nginx покончено, теперь нужно разрешить внешние подключения к порту 443, который используется nginx для HTTPS-соединений.
Собственно на этом настройка закончена. Проверяем правильность файла конфигурации и запускаем Nginx
У Let's Encrypt также есть свои минусы. Во-первых, сертификаты выдаются всего на 90 дней. Сертификаты на более длительный срок не предусмотрены. Во-вторых, для получения сертификатов используется множество зависимостей и плагинов. Само по себе это не страшно, но когда приходится обновлять сертификат каждые 3 месяца, неизбежно появятся проблемы. Кроме всего прочего, Let's Encrypt все еще находится в активной разработке, так что баги и ошибки неизбежны.
На некоторых хостингах получение и продление сертификата автоматически, вам нужно только сделать редирект с http на https (пример Beget)
Через пару минут уже было готово
Если же нет, делаем сами
Приступим.
Все действия должны выполняться на сервере, где располагается сайт. Т.е. по команде nslookup domain.com должен возвращаться именно IP-адрес вашего сервера, на котором будут выполняться дальнейшие действия. Это очень важно!
Первое что нужно сделать — получить сам клиент для связи с удостоверяющим сервером Let’s Encrypt.
Код:
git clone https://github.com/letsencrypt/letsencrypt && cd letsencrypt
Код:
sudo su
Код:
service nginx stop
Код:
./letsencrypt-auto certonly -d domain.com -d www.domain.com --server https://acme-v01.api.letsencrypt.org/directory
После генерации будет выведено сообщение об успешном получении SSL-сертификата.
Сертификаты находятся в папке /etc/letsencrypt/live/domain.com/
Проверяем что сертификат был сформирован правильно:
Код:
openssl x509 -noout -text -in /etc/letsencrypt/live/domain.com/cert.pem / grep 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/
Теперь дело остается за малым, настраиваем 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;
.....
}
Код:
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 -t
service nginx start
Код:
Проверяем что сайт доступен и перенаправляем с HTTP на HTTPS