Вступление
Let’s Encrypt - это новый центр сертификации (CA), который предоставляет простой способ получения и установки бесплатных сертификатов TLS / SSL, тем самым обеспечивая зашифрованный HTTPS на веб-серверах. Это упрощает процесс, предоставляя программный клиент Certbot, который пытается автоматизировать большинство необходимых шагов. В настоящее время весь процесс получения и установки сертификата полностью автоматизирован только на веб-серверах Apache. Тем не менее, Certbot можно использовать для получения бесплатного SSL-сертификата, который можно установить вручную, независимо от выбранного вами программного обеспечения веб-сервера.
В этом руководстве мы покажем вам, как использовать Let’s Encrypt для получения бесплатного SSL-сертификата и использования его с HAProxy в CentOS 7. Мы также покажем вам, как автоматически обновить ваш сертификат SSL.
изображение: https: //assets.digitalocean.com/articles/letsencrypt/haproxy-letsencrypt.png [HAProxy с сертификатом Let’s Encrypt TLS / SSL и автоматическим обновлением]
Предпосылки
Прежде чем следовать этому уроку, вам понадобится несколько вещей.
У вас должен быть сервер CentOS 7 с пользователем без полномочий root, который имеет права + sudo +
. Вы можете узнать, как настроить такую учетную запись пользователя, выполнив шаги 1-3 в нашей https://www.digitalocean.com/community/articles/initial-server-setup-with-centos-7[initial настройке сервера для CentOS 7 учебник.
Вы должны владеть или контролировать зарегистрированное доменное имя, с которым вы хотите использовать сертификат. Если у вас еще нет зарегистрированного доменного имени, вы можете зарегистрировать его у одного из множества регистраторов доменных имен (например, Namecheap, GoDaddy и т. Д.).
Если вы этого еще не сделали, обязательно создайте * A Record *, который указывает ваш домен на публичный IP-адрес вашего сервера. Это необходимо из-за того, что Let’s Encrypt проверяет, что вы являетесь владельцем домена, для которого выдается сертификат. Например, если вы хотите получить сертификат для + example.com +
, этот домен должен разрешиться на ваш сервер, чтобы процесс проверки заработал. Наша установка будет использовать + example.com +
и + www.example.com +
в качестве доменных имен, поэтому * необходимы обе записи DNS *.
После того, как у вас есть все необходимые условия, давайте перейдем к установке Certbot, клиентского программного обеспечения Let Encrypt.
Шаг 1 - Установка Certbot, клиента Let Encrypt
Первым шагом к использованию Let Encrypt для получения SSL-сертификата является установка программного обеспечения `+ certbot + 'на ваш сервер. В настоящее время лучший способ установить это через репозиторий EPEL.
Разрешите доступ к репозиторию EPEL на вашем сервере, набрав:
sudo yum install epel-release
После того, как хранилище было включено, вы можете получить пакет + certbot +
, набрав:
sudo yum install certbot
Клиент + certbot +
Let’s Encrypt должен быть установлен и готов к использованию.
Шаг 2 - Получение сертификата
Let’s Encrypt предоставляет различные способы получения SSL-сертификатов с помощью различных плагинов. В отличие от плагина Apache, который описан в другом учебнике https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-14-04. ], большинство плагинов помогут вам только в получении сертификата, который вы должны будете вручную настроить для своего веб-сервера. Плагины, которые только получают сертификаты и не устанавливают их, называются «аутентификаторами», поскольку они используются для проверки подлинности того, должен ли сервер выдавать сертификат.
Мы покажем вам, как использовать плагин * Standalone * для получения SSL-сертификата.
Убедитесь, что порт 80 открыт
Плагин Standalone предоставляет очень простой способ получения SSL-сертификатов. Он работает, временно запуская на вашем сервере небольшой веб-сервер с портом + 80 +
, к которому Let Encrypt CA может подключиться и проверить подлинность вашего сервера перед выдачей сертификата. Таким образом, этот метод требует, чтобы порт + 80 +
не использовался. То есть обязательно остановите ваш обычный веб-сервер, если он использует порт + 80 +
(т.е. + http +
), прежде чем пытаться использовать этот плагин.
Например, если вы используете HAProxy, вы можете остановить его, выполнив следующую команду:
sudo systemctl stop haproxy
Если вы не уверены, используется ли порт + 80 +
, вы можете выполнить эту команду:
netstat -na | grep ':80.*LISTEN'
Если при запуске этой команды нет вывода, вы можете использовать плагин Standalone.
Запустите Certbot
Теперь используйте плагин Standalone, выполнив эту команду:
sudo certbot certonly --standalone --preferred-challenges http --http-01-port 80 -d -d
Вам будет предложено ввести адрес электронной почты и принять условия обслуживания Let Encrypt. После этого будет запущен вызов + http +
. Если все прошло успешно, + certbot +
напечатает сообщение вывода следующим образом:
Output:IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/fullchain.pem. Your cert
will expire on . To obtain a new or tweaked version of
this certificate in the future, simply run certbot again. To
non-interactively renew *all* of your certificates, run "certbot
renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Вам нужно будет указать путь и дату истечения срока действия вашего сертификата, что было выделено в приведенном выше примере вывода.
Файлы сертификатов
После получения сертификата у вас будут следующие PEM-кодированные файлы:
-
* cert.pem: * Сертификат вашего домена
-
* chain.pem: * Сертификат цепочки Let’s Encrypt
-
* fullchain.pem: *
+ cert.pem +
и+ chain.pem +
вместе -
* privkey.pem: * Закрытый ключ вашего сертификата.
Важно, чтобы вы знали о местонахождении файлов сертификатов, которые были только что созданы, чтобы вы могли использовать их в конфигурации вашего веб-сервера. Сами файлы помещаются в подкаталог в + / etc / letsencrypt / archive +
. Однако Certbot создает символические ссылки на самые последние файлы сертификатов в каталоге + / etc / letsencrypt / live / +
.
Вы можете проверить, существуют ли файлы, выполнив эту команду (подставив имя вашего домена):
sudo ls /etc/letsencrypt/live/
Выходными данными должны быть четыре ранее упомянутых файла сертификата.
Объедините fullchain.pem и privkey.pem
При настройке HAProxy для выполнения SSL-терминации, чтобы он шифровал трафик между собой и конечным пользователем, вы должны объединить + fullchain.pem +
и + privkey.pem +
в один файл.
Сначала создайте каталог, в который будет помещен объединенный файл, + / etc / haproxy / certs +
:
sudo mkdir -p /etc/haproxy/certs
Затем создайте объединенный файл с помощью этой команды + cat +
(замените выделенный файл + example.com +
именем вашего домена):
DOMAIN='' sudo -E bash -c 'cat /etc/letsencrypt/live/$DOMAIN/fullchain.pem /etc/letsencrypt/live/$DOMAIN/privkey.pem > /etc/haproxy/certs/$DOMAIN.pem'
Безопасный доступ к объединенному файлу, который содержит закрытый ключ, с помощью этой команды:
sudo chmod -R go-rwx /etc/haproxy/certs
Теперь мы готовы использовать SSL-сертификат и закрытый ключ с HAProxy.
Шаг 3 - Установка HAProxy
Этот шаг охватывает установку HAProxy. Если он уже установлен на вашем сервере, пропустите этот шаг.
Установите HAProxy с помощью yum:
sudo yum install haproxy
HAProxy теперь установлен, но должен быть настроен.
Шаг 4 - Настройка HAProxy
Этот раздел покажет вам, как настроить базовый HAProxy с настройкой SSL. В нем также рассказывается, как настроить HAProxy, чтобы мы могли автоматически продлевать наш сертификат Let Encrypt.
Откройте + haproxy.cfg +
в текстовом редакторе:
sudo vi /etc/haproxy/haproxy.cfg
Оставьте этот файл открытым, так как мы редактируем его в следующих нескольких разделах.
Глобальный раздел
Добавьте эту строку в раздел * global *, чтобы настроить максимальный размер создаваемых временных ключей DHE:
haproxy.cfg - 1 из 5
tune.ssl.default-dh-param 2048
Разделы внешнего интерфейса
Теперь мы готовы определить ваши разделы + front end
.
Первое, что мы хотим добавить, - это внешний интерфейс для обработки входящих HTTP-соединений и отправки их в бэкэнд по умолчанию (который мы определим позже). В конце файла добавим внешний интерфейс * www-http *. Обязательно замените + haproxy_public_IP +
публичным IP-адресом вашего сервера HAProxy:
haproxy.cfg - 2 из 5
frontend www-http
bind :80
reqadd X-Forwarded-Proto:\ http
default_backend www-backend
Далее мы добавим внешний интерфейс для обработки входящих HTTPS-соединений. В конце файла добавьте интерфейс под названием * www-https *. Обязательно замените + haproxy_www_public_IP +
на общедоступный IP-адрес вашего сервера HAProxy. Также вам нужно заменить + example.com +
на ваше доменное имя (которое должно соответствовать файлу сертификата, который вы создали ранее):
haproxy.cfg - 3 из 5
frontend www-https
bind :443 ssl crt /etc/haproxy/certs/.pem
reqadd X-Forwarded-Proto:\ https
acl letsencrypt-acl path_beg /.well-known/acme-challenge/
use_backend letsencrypt-backend if letsencrypt-acl
default_backend www-backend
Этот веб-интерфейс использует ACL (+ letsencrypt-acl +
) для отправки запросов проверки Let’s Encrypt (для + /. Хорошо известный / acme-challenge +
) в бэкэнд + letsencrypt-backend +
, что позволит нам обновить сертификат без остановки службы HAProxy. Все остальные запросы будут перенаправлены в + www-backend +
, который является бэкэндом, который будет обслуживать наше веб-приложение или сайт.
Разделы бэкэнда
После того, как вы закончите настройку внешних интерфейсов, добавьте + www-backend +
backend, добавив следующие строки. Обязательно замените выделенные слова соответствующими частными IP-адресами ваших веб-серверов (отрегулируйте количество строк + server +
в соответствии с тем, сколько у вас есть внутренних серверов):
haproxy.cfg - 4 из 5
backend www-backend
redirect scheme https if !{ ssl_fc }
server www-1 :80 check
server www-2 :80 check
Любой трафик, который получает этот бэкэнд, будет сбалансирован между его записями + server +
, через HTTP (порт 80).
Наконец, добавьте + letsencrypt-backend +
backend, добавив эти строки
haproxy.cfg - 5 из 5
backend letsencrypt-backend
server letsencrypt 127.0.0.1:54321
Этот бэкэнд, который обрабатывает только вызовы Let Encrypt ACME, которые используются для запросов и обновлений сертификатов, отправляет трафик на локальный хост через порт + 54321 +
. Мы будем использовать этот порт вместо + 80 +
и + 443 +
при обновлении нашего SSL-сертификата Let Encrypt.
Теперь мы готовы запустить HAProxy:
sudo systemctl start haproxy
Теперь у нас есть сертификат Let Encrypt TLS / SSL, и мы готовы установить скрипт автообновления. На этом этапе вы должны проверить, работает ли сертификат TLS / SSL, посетив ваш домен в веб-браузере.
Шаг 5 - Настройка автоматического продления
Сертификаты Let Encrypt действительны всего 90 дней, поэтому важно автоматизировать процесс обновления.
Практический способ гарантировать, что ваши сертификаты не устареют, - создать задание cron, которое будет автоматически обрабатывать процесс обновления для вас. Cronjob будет запускать + certbot +
ежедневно и обновлять сертификаты, если они истекают в течение тридцати дней после истечения срока действия. + certbot +
также запускает специальный скрипт + renew-hook +
после любого успешного обновления. Мы будем использовать этот скрипт обновления для обновления нашего объединенного файла + .pem +
и перезагрузки haproxy.
Давайте создадим этот скрипт сейчас, а затем протестируем его.
Создать сценарий обновления
Откройте новый файл в + / usr / local / bin +
как * root *:
sudo vi /usr/local/bin/renew.sh
Это будет новый пустой текстовый файл. Вставьте следующий короткий скрипт, обязательно обновив выделенное доменное имя своим:
#!/bin/sh
SITE=
# move to the correct let's encrypt directory
cd /etc/letsencrypt/live/$SITE
# cat files to make combined .pem for haproxy
cat fullchain.pem privkey.pem > /etc/haproxy/certs/$SITE.pem
# reload haproxy
systemctl reload haproxy
Сохраните и закройте файл. Этот скрипт перемещается в правильный каталог Let Encrypt, запускает команду + cat +
, чтобы объединить два файла + .pem +
в один, и затем перезагружает haproxy.
Затем сделайте скрипт исполняемым:
sudo chmod u+x /usr/local/bin/renew.sh
Затем запустите скрипт:
sudo /usr/local/bin/renew.sh
Он должен работать без ошибок. Затем мы обновим Certbot и настроим его для запуска этого сценария обновления.
Обновление настроек Certbot
Команда + certbot renew +
, которую мы будем использовать для обновления наших сертификатов, считывает файл конфигурации, который был создан при первом запуске + certbot +
. Нам нужно открыть этот файл и обновить порт, который + certbot +
использует для запуска автономного http-сервера, чтобы он не конфликтовал с haproxy (который уже прослушивает порты 80 и 443). Откройте файл конфигурации в текстовом редакторе:
sudo vi /etc/letsencrypt/renewal/.conf
Нам нужно изменить строку + http01_port +
, чтобы она выглядела следующим образом:
example.com.conf
http01_port =
Сохраните и закройте файл. Теперь протестируйте процесс обновления, указав + - dry-run +
, чтобы мы ничего не обновляли:
sudo certbot renew --dry-run
Certbot будет прослушивать порт 54321 для запроса на обновление, а haproxy проксирует запрос с порта 80 на 54321.
Создать Cron Job
Затем мы отредактируем crontab, чтобы создать новое задание, которое будет запускать команду + certbot renew +
каждый день. Чтобы отредактировать crontab для пользователя root, запустите:
sudo crontab -e
Добавьте следующее в конец файла:
запись crontab
30 2 * * * /usr/bin/certbot renew --renew-hook "/usr/local/bin/renew.sh" >> /var/log/le-renewal.log
Сохранить и выйти. Это создаст новое задание cron, которое будет выполнять команду + certbot renew +
каждый день в 2:30. Вывод этой команды будет передан в файл журнала, расположенный по адресу + / var / log / le-renewal.log +
. Если сертификат действительно обновлен, будет запущен скрипт + - renew-hook +
для создания комбинированного файла PEM и перезагрузки + haproxy +
.
Заключение
Это оно! HAProxy теперь использует бесплатный сертификат Let Encrypt TLS / SSL для безопасного обслуживания HTTPS-трафика.