» » » LetsEncrypt (Lets Encrypt) – настройка с Nginx + Apache или Nginx + PHP-FPM

LetsEncrypt (Lets Encrypt) – настройка с Nginx + Apache или Nginx + PHP-FPM

LetsEncrypt (Lets Encrypt) – настройка с Nginx + Apache или Nginx + PHP-FPM

На прошлой неделе socengine.ru перешел с протокола HTTP на зашифрованный HTTPS. Сделать шифрование хотел давно, но руки не доходили, была попытка получить сертификат у StartSSL, но тогда ошибся одним символов из-за чего процесс активации сертификата завис. Хотел уже купить сертификат, но наткнулся на бета-версию (на тот момент) удостоверяющего центра Let’s Encrypt, который бесплатно раздавал сертификаты, попробовать данный сервис решил после его выхода из беты.

В итоге LetsEncrypt допилили и теперь это новый способ получить бесплатный сертификат.

Центр сертификации LetsEncrypt выдает сертификаты «domain validation» со сроком действия в 90 дней. Обычно сертификаты выпускаются на год, но LetsEncrypt осуществляет перевыпуск сертификата в автоматическом режиме, так что 90 дней не проблема.

Варианты сертификатов Organization Validation и Extended Validation Certificate отсуствуют и не планируются, но они мне не нужны. Поддомены подписывать можно.

LetsEncrypt – настройка с Nginx + Apache или Nginx + PHP-FPM

У меня встречается два варианта конфигурации веб-сервера: Nginx + Apache и Nginx + PHP-FPM. Начало для обоих конфигураций одинаковое, есть различия в конце настройки. Операционная система Debian 8.

 

Настройка LetsEncrypt с Nginx + Apache или Nginx + PHP-FPM

Создаем папку для Lets Encrypt:

mkdir /opt/letsencrypt/


Устанавливаем git, если нет:

apt-get update
apt-get install git


Скачиваем bash-скрипт, который автоматизирует все процессы:

git clone https://github.com/lukas2511/letsencrypt.sh.git /opt/letsencrypt/


Скрипту нужна папка, создаем её:

mkdir /opt/letsencrypt/.acme-challenges


Копируем конфигурацию:

cp /opt/letsencrypt/docs/examples/config /opt/letsencrypt/config


В конфигурацию добавляем данные своей почты:

CONTACT_EMAIL=""


В файл domains.txt прописываем свой домен:

echo "domain" > /opt/letsencrypt/domains.txt


Если нужно поддомены:

echo "domain sub1.domain sub2.domain" > /opt/letsencrypt/domains.txt


В конфигурацию виртуального хоста добавляем правило с алиасом:

location /.well-known/acme-challenge/ { alias /opt/letsencrypt/.acme-challenges/; }


Перезапускаем Nginx:

service nginx restart


Запускаем bash-скрипт:

/opt/letsencrypt/letsencrypt.sh --cron


Смотрим лог, если все успешно, то подрубаем SSL в настройку виртуального хоста:

listen 443 ssl;
ssl_certificate /opt/letsencrypt/certs/domain/fullchain.pem;
ssl_certificate_key /opt/letsencrypt/certs/domain/privkey.pem;


Перезапускаем Nginx:

service nginx restart

Идем в браузер и заходим на сайт c https, если видим замок в адресной строке, значит всё работает, смотрим в консоль браузера на предмет ошибок, ибо теперь все вокруг должно быть https. Если перейдя по адресу с https шифрование отсутствует, смотрим в консоль браузера на предмет ошибок, если там пусто, то разбираем свои конфигурации.

Теперь добавляем в cron задачу обновления сертификатов:

crontab -e


Задача:

1 0 * * * /opt/letsencrypt/letsencrypt.sh --cron

Всё готово.

Если нужен только HTTPS, то добавляем в конфигурацию виртуального хоста условие и перезагружаем nginx:

if ( $scheme = "http" ) {
return 301 https://$server_name$request_uri;
}

 

Для Nginx + Apache

В конфигурацию виртуального хоста Nginx добавляем параметр:

proxy_set_header X-Forwarded-Proto $scheme;


В конфигурацию виртуального хоста Apache добавляем параметр:

SetEnvIf X-Forwarded-Proto https HTTPS=on

Перезагружаем Nginx и Apache, смотрим результат в браузере.

Обратите внимание, что повторный запуск команды /opt/letsencrypt/letsencrypt.sh --cron не создаст новый сертификат из-за его актуального срока, чтобы сгенерировать новый сертификат используйте дополнительный ключ /opt/letsencrypt/letsencrypt.sh --cron --force

root@test:~# /opt/letsencrypt/letsencrypt.sh --cron --force
# INFO: Using main config file /opt/letsencrypt/config
Processing domain.com
+ Checking domain name(s) of existing cert... unchanged.
+ Checking expire date of existing cert...
+ Valid till Oct 10 05:55:00 2016 GMT (Longer than 30 days). Ignoring because renew was forced!
+ Signing domains...
+ Generating private key...
+ Generating signing request...
+ Requesting challenge for domain.com...
+ Responding to challenge for domain.com...
+ Challenge is valid!
+ Requesting certificate...
+ Checking certificate...
+ Done!
+ Creating fullchain.pem...
+ Done!

Есть еще неофициальный сервис https://letsmonitor.org/ – через него можно отслеживать срок действия сертификатов.

https://www.sslshopper.com/ssl-checker.html – проверяет правильность настройки SSL.

Обновлено: 23.09.2016

Сегодня скачал скрипт для нового сервера и в нем произошли изменения юридического характера.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! letsencrypt.sh has been renamed to dehydrated !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Due to trademark violation letsencrypt.sh had to be renamed and is know called dehydrated.
To make a clean cut dehydrated doesn't use the old config locations /etc/letsencrypt.sh and
/usr/local/etc/letsencrypt.sh anymore, also the script file has been renamed.
If you were using the default WELLKNOWN location please also update your webserver to use /var/www/dehydrated.
You are currently running (or reading) a temporary wrapper which handles the old config locations,
you should update your setup to use /etc/dehydrated and the 'dehydrated' script file as soon as possible.

Обновите пути и названия файлов. В тексте блога пути и названия файлов изменю позже.

LetsEncrypt (Lets Encrypt) – настройка с Nginx + Apache или Nginx + PHP-FPM

Другие публикации по теме:

Комментарии