Настройка Nginx с Let’s Encrypt на CentOS 7 / Хабр

Настройка Nginx с Let's Encrypt на CentOS 7 / Хабр Сертификаты
Содержание
  1. Почему лучше рассчитывать на sni?
  2. Получаем Cloudflare API токен
  3. Настройка автопродления сертификатов
  4. Инсталлируем acme.sh клиент
  5. Выпускаем Let’s Encrypt wildcard сертификат
  6. Конфигурируем веб-сервер Ngnix
  7. Инсталлируем Let’s Encrypt wildcard сертификат
  8. Автоматическое продление Let’s Encrypt wildcard сертификата
  9. Caveat emptor
  10. Error: letsencrypt challenge request 429
  11. Вот и всё
  12. Выпуск и настройка сертификата для панели управления vestacp
  13. Если нужно добавить поддомен или домен в сертификат
  14. Если нужно получить сертификат для домена без сайта…
  15. Команды acme.sh для обновления сертификатов let’s encrypt
  16. Обновление от 01.05.2021
  17. Подготовим nginx к получению сертификатов
  18. Подготовительные работы по установке и конфигурированию веб-сервера nginx
  19. Получаем сертификаты
  20. Проверим полученный сертификат
  21. Продление сертификатов
  22. Регистрация в let’s encrypt
  23. Установка в jessie
  24. Установка сертификата ssl
  25. Шаг 1 — установка клиента letsencrypt
  26. Шаг 2 — получение сертификата
  27. Шаг 4 — настройка автопродление
  28. Шаг 5 — обновление let’s encrypt (не обязательно)
  29. Заключение
  30. Рекомендуемые статьи по теме:

Почему лучше рассчитывать на sni?

  1. Это просто. Вам не нужно постоянно держать в голове факты о выданных сертификатах. Для какого домена сертификат был выдан первым. К какому сертификату нужно добавлять еще домены. И так далее… Ни о чем таком со SNI не нужно думать.

  2. Секреты остаются секретами. Если у вас для всех доменов один сертификат, то любой сможет очень легко увидеть весь список, независимо от вашего желания. Если же для каждого сайта свой сертификат, то такой проблемы нет.

Например, так можно посмотреть домены в сертификате Тематических Медиа:

Получаем Cloudflare API токен

Для начала, нам необходимо зарегистрироваться в Cloudflare и получить там API токен. Эти действия нам необходимы для свидетельства нашего права на владение доменом (для Let’s Encrypt). После регистрации в сервисе, заходим в панель управления Cloudflare и получим API токен, выполнив следующие действия (см. скриншоты ниже):

"Create Token” > “Edit zone DNS” > Use template:

Убедитесь, что вы настроили DNS разрешения для редактирования и включили зону для своего доменного имени, (например, для letsencrypt.co.ua), см. скриншот:

После этого, нажмите “Continue to summary”, чтобы увидеть “Edit zone DNS API token summary”.

В конце, скопируйте токен, который вы увидите на экране, для получения доступа к Cloudflare API. Держите этот токен в секрете.

Проверяем правильную работу токена командой:

Настройка автопродления сертификатов

Тут всё просто, точнее даже очень просто.

Создаем исполняемый bash скрипт следующего содержания:

Инсталлируем acme.sh клиент

На следующем этапе, необходимо установить клиент acme.sh, для этого выполним следующие команды (клонируем репозиторий acme.sh с помощью команды git):

Выпускаем Let’s Encrypt wildcard сертификат

После установки и конфигурации веб-сервера Nginx, получения Cloudflare API токена и инсталляции acme.sh, самое время приступить к выпуску wildcard сертификата для домена letsencrypt.co.ua.

Перейдем в каталог cd /root/.acme.sh для дальнейших действий.

Сначала настроим CF_Token с помощью команды экспорта следующим образом:

# Export single variable for the CloudFlare DNS challenge to work #
 export CF_Token="Your_Cloudflare_DNS_API_Key_Goes_here"

Определять переменные оболочки CF_Account_ID и CF_Zone_ID нам не нужно, так как они будут автоматически извлечены файлом acme.sh. Затем запросим сертификат для домена:

./acme.sh --issue --dns dns_cf --ocsp-must-staple --keylength 4096 -d letsencrypt.co.ua -d '*.letsencrypt.co.ua'

Если вы работаете с криптографией на основе эллиптических кривых (ECC/ECDSA) вместо RSA, то синтаксис команды будет следующим:

./acme.sh --issue --dns dns_cf --ocsp-must-staple --keylength ec-384 -d letsencrypt.co.ua -d '*.letsencrypt.co.ua'

Наш ключ Cloudflare DNS API находится в файле /root/.acme.sh/account.conf, проверить его возможно с помощью команды cat или grep:

cat /root/.acme.sh/account.conf
grep '_CF_' /root/.acme.sh/account.conf

Конфигурируем веб-сервер Ngnix

На этом этапе нам необходимо убедиться в том, что файл обмена ключами Диффи-Хеллмана уже создан:

mkdir -pv /etc/nginx/ssl/letsencrypt.co.ua/
openssl dhparam -out /etc/nginx/ssl/dhparams.pem 4096
acme.sh --issue --nginx --ocsp-must-staple --keylength 4096 -d letsencrypt.co.ua

Затем создадим и отредактируем файл конфигурации для нашего домена letsencrypt.co.ua:

nano /etc/nginx/conf.d/letsencrypt.co.ua.conf

Занесем туда следующие строки:

Инсталлируем Let’s Encrypt wildcard сертификат

Сейчас необходимо приступить к установке сертификата (при необходимости, замените команду systemctl reload nginx, в соответствии с инструкцией к вашему дистрибутиву Linux):

DOMAIN="letsencrypt.co.ua"
CONFIG_ROOT="/etc/nginx/ssl/${DOMAIN}"
acme.sh -d "$DOMAIN" 
--install-cert 
--reloadcmd "systemctl reload nginx" 
--fullchain-file "${CONFIG_ROOT}/$DOMAIN.fullchain.cer" 
--key-file "${CONFIG_ROOT}/$DOMAIN.key" 
--cert-file "${CONFIG_ROOT}/$DOMAIN.cer"

Если вы используете ECC/ECDSA, то синтаксис команды будет выглядеть следующим образом:

DOMAIN="letsencrypt.co.ua"
CONFIG_ROOT="/etc/nginx/ssl/${DOMAIN}"
acme.sh -d "$DOMAIN" 
--ecc 
--install-cert 
--reloadcmd "systemctl reload nginx" 
--fullchain-file "${CONFIG_ROOT}/$DOMAIN.fullchain.cer.ecc" 
--key-file "${CONFIG_ROOT}/$DOMAIN.key.ecc" 
--cert-file "${CONFIG_ROOT}/$DOMAIN.cer.ecc"

Автоматическое продление Let’s Encrypt wildcard сертификата

Обновление будет происходить автоматически через cronjob, чтобы просмотреть все задания в cron, введите команду:

crontab -l

Отобразится примерно следующая информация (см. скриншот ниже):

8 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

Если возникнет необходимость, мы можем произвести обновление вручную:

./acme.sh --renew --force --dns dns_cf --ocsp-must-staple --keylength 4096 -d letsencrypt.co.ua -d '*. letsencrypt.co.ua'

В следующем разделе мы опишем подробнее как продлить ssl сертификат.

Caveat emptor

Всё знаете про SNI? Читайте сразу про установку.

Error: letsencrypt challenge request 429

  • Попробуйте удалить домен из панели VestaCP и добавить его снова, после чего повторить попытку выпуска сертификата.
  • Повторите попытку выпуска сертификата через 1 час.

Вот и всё

Если вам близки по духу tee и sed, то есть гораздо более короткая инструкция по настройке связки Let’s Encrypt и nginx, при условии корректно настроенного hostname. Только копируй команды и вставляй.

Выпуск и настройка сертификата для панели управления vestacp

Поддержка Let’s Encrypt доступна в VestaCP из коробки.

Для выпуска и установки сертификата вы можете отметить дополнительные опции сразу при добавлении домена в разделе WEB панели VestaCP:

Или отредактировать настройки домена в разделе WEB, выбрав опции поддержки SSL уже после добавления:

Выпуск и автоматическая установка сертификата занимают до 5 минут. После этого данные SSL-сертификата будут доступны также в настройках домена.

Помимо этого, добавляется cron-задание для автоматического обновления сертификатов, истекающих через 30 и менее дней. Проверить это можно в разделе CRON панели VestaCP:

Если нужно добавить поддомен или домен в сертификат

Если вы вдруг забыли указать поддомен www, или вам нужно добавить другой домен или поддомен в сертификат (которых может быть до 100 в одном сертификате), то это легко сделать после получения сертификата. Просто запустите команду еще раз, добавив требуемое имя:

Если нужно получить сертификат для домена без сайта…

Типичный пример — сертификат для выделенных под SMTP или IMAP серверов, на которых вообще нет каких-то сайтов. Либо используйте универсальный переадресатор что выше, либо…

Команды acme.sh для обновления сертификатов let’s encrypt

Общий синтаксис:

acme.sh -f -r -d {your-domain-here}
acme.sh --force --renew --domain {your-domain-name-here}

Пример использования команды для нашего домена:

acme.sh -f -r -d letsencrypt.co.ua

Где:

--renew ИЛИ -r: продлить сертификат;
--domain ИЛИ -d: указывает домен;
--force ИЛИ -f: используется для принудительного выпуска или немедленного обновления сертификата.

После проведения работ по выпуску или принудительному продлению сертификата необходимо перезапустить веб-сервер (Nginx или Apache) с помощью следующих команд (в соответствии с инструкцией к вашему дистрибутиву Линукс).

Для Nginx:

sudo service nginx reload

Для Apache:

Обновление от 01.05.2021

Когда настал срок обновления сертификата, то он не обновился, вылезла следующая ошибка: “PluginError: An authentication script must be provided with –manual-auth-hook when using the manual plugin non-interactively.“

Как решить проблему и всё таки настроить автоматическое обновление сертификата читаем здесь: Автоматизация обновлений wildcard сертификата от Let’s Encrypt.

Подготовим nginx к получению сертификатов

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

location /.well-known {
    root /var/www/html;
}

Понятно, что вписывать для каждого сайта такой блок явно — это моветон, потому создадим файл /etc/nginx/acme с содержанием блока выше.

# cat /etc/nginx/acme 
location /.well-known {
    root /var/www/html;
}

Затем для каждого домена и поддомена, для которых нужно получить сертификаты, в блоке server перед всеми блоками location укажем:

include acme;

Хосты-редиректоры (например, с голого домена на www) можно пропустить. ACME сервер обязан учитывать стандартную переадресацию. Подробней об этом ниже.

Перезагрузим nginx и проверим что наш тестовый файл виден:

Подготовительные работы по установке и конфигурированию веб-сервера nginx

Все действия будем проводить с тестовым доменом letsencrypt.co.ua. Перед тем, как начать процесс установки, необходимо выполнить обновления на серверной ОС Ubuntu:

apt update && apt full-upgrade –y

Затем установим веб-сервер Nginx:

1) Команда для OC Ubuntu:

sudo apt install nginx

2) Команда для OC CentOS:

sudo yum install nginx

Затем наш домен нужно добавить в качестве виртуального хоста на веб-сервер Nginx, для этого проделаем следующие действия:

1) Создаем каталог для нового сайта, вместо letsencrypt.co.ua подставьте имя своего домена (параметр -p необходим для автоматической генерации каталогов):

mkdir -p /var/www/letsencrypt.co.ua/public_html

2) Выставим права на папку, чтобы у нас была возможность чтения файлов в ней:

chmod 755 /var/www

3) В редакторе nano создаем новый файл index.html в уже созданном нами каталоге:

nano /var/www/letsencrypt.co.ua/public_html/index.html

4) Помещаем в файл следующий исходный код:

5) Сейчас отредактируем файл с настройками ngnix:

nano /etc/nginx/conf.d/virtual.conf

Необходимо вписать следующие строки в файл (указать имя домена, корневую папку и т.д.):

#
# A virtual host using mix of IP-, name-, and port-based configuration
#
server {
listen       80;
#    listen       *:80;
server_name   letsencrypt.co.ua;
location / {
root   /var/www/letsencrypt.co.ua/public_html/;
index  index.html index.htm;
}
}

6) Теперь отредактируем файл nano /etc/hosts (пропишем соответствие нашего домена IP-адресу VPS):

#Virtual Hosts
178.20.153.253   letsencrypt.co.ua

7) Для того, чтобы все наши настройки вступили в силу, выполним рестарт Nginx командой:

/etc/init.d/nginx restart

8) Чтобы проверить, работает ли наш сайт и привязан ли он к IP, откроем браузер и наберем:

letsencrypt.co.ua

Как мы видим на скриншоте ниже, наша тестовая страница отображается, значит все настроено правильно.

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

У Let’s Encrypt есть лимиты на количество обращений за сертификатами, потому сначала попробуем получить необходимый сертификат в режиме для тестов:

Проверим полученный сертификат

Убедимся что полученный сертификат — именно тот, что нам нужен:

Продление сертификатов

Сертификаты выдаются на три месяца. Не на полгода, не на год, а лишь на три месяца. Естественно это вызывает вопросы. Нужно ли проходить всю эту процедуру через три месяца? Нужно ли это делать всегда до искончания веков? Может стоит всё-таки вложиться в платный сертификат чтобы забыть об этом всем и не воспоминать пару лет?

Но нет, не спешите искать платежные средства! Как и было обещано в начале статьи, с обновлением сертификатов проблем нет.

Регистрация в let’s encrypt

Регистрацию нужно сделать только один раз:

Установка в jessie

Если у вас еще в ходу актуальный на конец 2021 года Debian stable “jessie”, то всё лишь немного сложнее.

Установка сертификата ssl


Переходим к проекту Letsencrypt, куда мы клонировали файлы. И запускаем генерацию сертификатов командой letsencrypt-auto certonly, используя плагин webroot.

Шаг 1 — установка клиента letsencrypt

Итак, что мы имеем:

— Веб сервер под управлением CentOS, Nginx;

— Установленные программы Git, Bc.

На всякий случай:

sudo yum -y install git bc

После того, как git и bc установлены, переходим к клонированию проекта letsencrypt из GitHub.

Шаг 2 — получение сертификата

Letsencrypt предоставляет множество способов получения SSL-сертификатов с помощью различных плагинов. В отличии от плагина Apache, который устанавливается автоматически, нам придется ставить сертификат вручную.

Шаг 4 — настройка автопродление

Сертификаты действительный 90 дней, но рекомендуется продлевать сертификаты каждые 60 дней. Мы это автоматизируем с помощью cron.

Чтобы запустить процесс обновления для всех установленных доменов, выполните следующую команду:

/opt/letsencrypt/letsencrypt-auto renew

Так как мы недавно установили сертификат, то команда будет проверять только дату истечения срока действия и распечатает сообщение, информирующее о том, что сертификат не нуждается в продлении. Вы увидите примерно следующие в консоли:

Шаг 5 — обновление let’s encrypt (не обязательно)

Всякий раз, когда новые обновления доступны для клиента Let’s Encrypt, вы можете обновить локальную копию, запустив git pull из каталога /opt/letsencrypt:

cd /opt/letsencrypt
sudo git pull

Это позволит загрузить все последние изменения из хранилище для обновления клиента Let’s Encrypt.

Заключение

В этой статье мы рассказали, как получить и продлить ssl сертификат совершенно бесплатно с помощью сервиса Let’s Encrypt для основного домена и его всех поддоменов. Также подробно описан процесс конфигурирования веб-сервера Nginx, использования сервиса Cloudflare и утилиты ACME.sh для выпуска wildcard Let’s Encrypt сертификата.

Данный материал будет полезен системным администраторам и веб-мастерам корпоративных сайтов. Специалисты компании FREEhost.UA всегда проконсультируют вас по вопросам выпуска и обновления ssl сертификата для ваших доменов.

Про сертификаты:  Сертификат соответствия на антенны
Оцените статью
Мой сертификат
Добавить комментарий