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 отсуствуют и не планируются, но они мне не нужны. Поддомены подписывать можно.
У меня встречается два варианта конфигурации веб-сервера: 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.
Обновите пути и названия файлов. В тексте блога пути и названия файлов изменю позже.