Поиск по сайту:

Как защитить Apache с помощью Let's Encrypt на CentOS 7


Введение

Сертбот.

В этом руководстве вы будете использовать Certbot для настройки сертификата TLS/SSL от Let’s Encrypt на сервере CentOS 7, использующем Apache в качестве веб-сервера. Кроме того, вы автоматизируете процесс обновления сертификата с помощью задания cron, о котором вы можете узнать больше, прочитав «Как использовать Cron для автоматизации задач на VPS».

Предпосылки

Чтобы выполнить это руководство, вам потребуется:

  • Один сервер CentOS 7, настроенный в соответствии с руководством по первоначальной настройке сервера CentOS 7, с пользователем без полномочий root, имеющим права sudo.
  • Базовый брандмауэр, настроенный в соответствии с дополнительными рекомендуемыми действиями для новых серверов CentOS 7.
  • Apache установлен на сервере CentOS 7 с настроенным виртуальным хостом. Вы можете узнать, как настроить это, следуя нашему руководству по файлу виртуального хоста для вашего домена. В этом руководстве в качестве примера будет использоваться /etc/httpd/sites-available/example.com.conf.
  • Вы должны владеть или контролировать зарегистрированное доменное имя, с которым хотите использовать сертификат. Если у вас еще нет зарегистрированного доменного имени, вы можете приобрести его на Freenom или воспользоваться услугами регистратора доменов по вашему выбору.
  • Запись A DNS, указывающая ваш домен на общедоступный IP-адрес вашего сервера. Вы можете следовать этому введению в DNS DigitalOcean, чтобы узнать, как добавить их на платформу DigitalOcean. Записи DNS A необходимы из-за того, как Let’s Encrypt проверяет, что вы являетесь владельцем домена, для которого он выдает сертификат. Например, если вы хотите получить сертификат для example.com, этот домен должен разрешаться на ваш сервер, чтобы процесс проверки работал. Наша установка будет использовать example.com и www.example.com в качестве доменных имен, оба из которых будут требуется действительная запись DNS.

Когда вы выполните все эти предварительные условия, перейдите к установке клиентского программного обеспечения Let’s Encrypt.

Шаг 1 — Установка клиента Certbot Let’s Encrypt

Чтобы использовать Let’s Encrypt для получения SSL-сертификата, сначала необходимо установить Certbot и mod_ssl, модуль Apache, обеспечивающий поддержку шифрования SSL v3.

Пакет certbot недоступен через диспетчер пакетов по умолчанию. Вам нужно будет включить репозиторий EPEL для установки Certbot.

Чтобы добавить репозиторий CentOS 7 EPEL, выполните следующую команду:

  1. sudo yum install epel-release

Теперь, когда у вас есть доступ к репозиторию, установите все необходимые пакеты:

  1. sudo yum install certbot python2-certbot-apache mod_ssl

В процессе установки вас спросят об импорте ключа GPG. Этот ключ проверит подлинность пакета, который вы устанавливаете. Чтобы завершить установку, примите ключ GPG, введя y и нажав ENTER, когда будет предложено сделать это.

После установки этих служб вы готовы запустить Certbot и получить свои сертификаты.

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

Теперь, когда Certbot установлен, вы можете использовать его для запроса SSL-сертификата для вашего домена.

Использование клиента certbot Let’s Encrypt для создания SSL-сертификата для Apache позволяет автоматизировать многие этапы процесса. Клиент автоматически получит и установит новый SSL-сертификат, действительный для доменов, указанных вами в качестве параметров.

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

  1. sudo certbot --apache -d example.com

Это запускает certbot с подключаемым модулем --apache и указывает домен для настройки сертификата с флагом -d.

Если вы хотите установить один сертификат, действительный для нескольких доменов или субдоменов, вы можете передать их в качестве дополнительных параметров команде, пометив каждый новый домен или субдомен флагом -d. Первым доменным именем в списке параметров будет базовый домен, используемый Let’s Encrypt для создания сертификата. По этой причине передайте базовое доменное имя первым в списке, за которым следуют любые дополнительные поддомены или псевдонимы:

  1. sudo certbot --apache -d example.com -d www.example.com

Базовым доменом в этом примере является example.com.

Утилита certbot также может запрашивать информацию о домене во время процедуры запроса сертификата. Чтобы использовать эту функцию, вызовите certbot без каких-либо доменов:

  1. sudo certbot --apache

Программа предоставит вам пошаговое руководство по настройке параметров сертификата. Он попросит вас указать адрес электронной почты для восстановления утерянного ключа и уведомлений, а затем предложит согласиться с условиями обслуживания. Если вы не указали свои домены в командной строке, вам также будет предложено это сделать. Если в ваших файлах виртуального хоста домен, который они обслуживают, не указан явно с помощью директивы ServerName, вам будет предложено выбрать файл виртуального хоста. В большинстве случаев будет работать файл ssl.conf по умолчанию.

Вы также сможете выбрать между включением доступа к http и https или принудительной переадресацией всех запросов на https. Для большей безопасности рекомендуется выбрать вариант 2: Redirect, если у вас нет особой необходимости разрешать незашифрованные соединения. Выберите свой вариант и нажмите ENTER.

Output
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel):2

Когда установка будет успешно завершена, вы увидите сообщение, подобное этому:

Output
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/example.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/example.com/privkey.pem Your cert will expire on 2019-08-14. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - 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

Сгенерированные файлы сертификатов будут доступны в подкаталоге с именем вашего базового домена в каталоге /etc/letsencrypt/live.

Теперь, когда ваши сертификаты загружены, установлены и загружены, вы можете проверить статус сертификата SSL, чтобы убедиться, что все работает.

Шаг 3 — Проверка статуса вашего сертификата

На этом этапе вы можете убедиться, что Certbot правильно создал ваш SSL-сертификат, используя файл Qualys.

Откройте следующую ссылку в предпочитаемом веб-браузере, заменив example.com своим базовым доменом:

https://www.ssllabs.com/ssltest/analyze.html?d=example.com

Вы попадете на страницу, которая сразу же начнет тестирование SSL-соединения с вашим сервером:

После запуска теста его выполнение может занять несколько минут. Статус теста обновится в вашем браузере.

Когда тестирование завершится, на странице будет отображаться буквенная оценка, которая оценивает безопасность и качество конфигурации вашего сервера. На момент написания этой статьи настройки по умолчанию дают оценку A:

Для получения дополнительной информации о том, как SSL Labs определяет эти оценки, ознакомьтесь с публикацией SSL Labs Grading, в которой подробно описаны обновления, внесенные в схему оценок в январе 2018 года.

Попробуйте перезагрузить свой веб-сайт с помощью https:// и обратите внимание на индикатор безопасности вашего браузера. Теперь это будет означать, что сайт надежно защищен, обычно с зеленым значком замка.

Когда ваш SSL-сертификат установлен и проверен, следующим шагом будет настройка автоматического обновления для вашего сертификата, чтобы ваш сертификат оставался действительным.

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

Сертификаты Let’s Encrypt действительны в течение 90 дней, но рекомендуется обновлять сертификаты каждые 60 дней, чтобы допустить погрешность. По этой причине рекомендуется автоматизировать этот процесс, чтобы периодически проверять и обновлять сертификат.

Во-первых, давайте рассмотрим команду, которую вы будете использовать для обновления сертификата. В клиенте certbot Let’s Encrypt есть команда renew, которая автоматически проверяет установленные сертификаты и пытается обновить их, если до истечения срока их действия осталось менее 30 дней. Используя параметр --dry-run, вы можете запустить симуляцию этой задачи, чтобы проверить, как работает renew:

  1. sudo certbot renew --dry-run

Вывод должен выглядеть примерно так:

Output
Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/example.com.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator apache, Installer apache Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org Renewing an existing certificate Performing the following challenges: http-01 challenge for example.com http-01 challenge for www.example.com Waiting for verification... Cleaning up challenges Resetting dropped connection: acme-staging-v02.api.letsencrypt.org - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - new certificate deployed with reload of apache server; fullchain is /etc/letsencrypt/live/example.com/fullchain.pem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates below have not been saved.) Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/example.com/fullchain.pem (success) ...

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

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

Официальная документация Certbot рекомендует запускать cron два раза в день. Это гарантирует, что в случае, если Let’s Encrypt инициирует отзыв сертификата, Certbot обновит ваш сертификат не более чем за полдня.

Отредактируйте crontab, чтобы создать новое задание, которое будет запускать обновление два раза в день. Чтобы отредактировать crontab для пользователя root, запустите:

  1. sudo crontab -e

Ваш текстовый редактор откроет crontab по умолчанию, который на данный момент является пустым текстовым файлом. В этом руководстве будет использоваться текстовый редактор vi. Чтобы узнать больше об этом текстовом редакторе и его преемнике vim, ознакомьтесь с нашим руководством по установке и использованию текстового редактора Vim на облачном сервере.

Войдите в режим вставки, нажав i, и добавьте следующую строку:

crontab
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew

Когда вы закончите, нажмите ESC, чтобы выйти из режима вставки, затем :wq и ENTER, чтобы сохранить и выйти из файла. Это создаст новое задание cron, которое будет выполняться в полдень и в полночь каждый день. Добавление элемента случайности к вашим заданиям cron гарантирует, что ежечасные задания не будут выполняться в одну и ту же минуту, вызывая всплеск производительности сервера; python -c import random; время импорта; time.sleep(random.random() * 3600) выберет случайную минуту в течение часа для ваших задач обновления.

Для получения дополнительной информации о том, как создавать и планировать задания cron, вы можете ознакомиться с нашей документацией Certbot.

Заключение

В этом руководстве вы установили клиент Let’s Encrypt Certbot, загрузили SSL-сертификаты для своего домена и настроили автоматическое обновление сертификатов. Если у вас есть какие-либо вопросы об использовании Certbot, вы можете периодически проверять официальный блог Let’s Encrypt на наличие важных обновлений.