Как защитить Apache с помощью Let's Encrypt в Ubuntu
Введение
Let’s Encrypt — это центр сертификации (CA), который облегчает получение и установку бесплатных сертификатов TLS/SSL, тем самым обеспечивая шифрование HTTPS на веб-серверах. Он упрощает процесс, предоставляя программный клиент Certbot, который пытается автоматизировать большинство (если не все) необходимых шагов. На данный момент весь процесс получения и установки сертификата полностью автоматизирован как на Apache, так и на Nginx.
В этом руководстве вы будете использовать Certbot для получения бесплатного сертификата SSL для Apache в Ubuntu и убедитесь, что этот сертификат настроен на автоматическое продление.
В этом руководстве используется отдельный файл виртуального хоста вместо файла конфигурации Apache по умолчанию для настройки веб-сайта, который будет защищен с помощью Let’s Encrypt. Мы рекомендуем создавать новые файлы виртуального хоста Apache для каждого домена, размещенного на сервере, поскольку это помогает избежать распространенных ошибок и сохраняет файлы конфигурации по умолчанию в качестве резервной настройки.
Как защитить Apache с помощью Let’s Encrypt в Ubuntu
- Установка сертификатбота
- Проверка конфигурации виртуального хоста Apache
- Разрешение HTTPS через брандмауэр
- Получение SSL-сертификата
- Проверка автоматического продления Certbot
Предварительные условия
Чтобы следовать этому руководству, вам понадобится:
Один сервер Ubuntu настроен для пользователя, не являющегося root, с правами администратора
sudo
и включенным брандмауэром. Вы можете настроить это, следуя нашему руководству по первоначальной настройке сервера для Ubuntu.-
Полностью зарегистрированное доменное имя. В этом руководстве в качестве примера будет использоваться ваш_домен. Вы можете приобрести доменное имя на Namecheap, получить его бесплатно на Freenom или использовать регистратора доменов по вашему выбору.
Обе следующие записи DNS настроены для вашего сервера. Вы можете ознакомиться с этим введением в DigitalOcean DNS, чтобы узнать, как их добавить.
- Запись A с
your_domain
, указывающая на общедоступный IP-адрес вашего сервера.
- Запись A с
- Запись A с
www.your_domain
, указывающая на общедоступный IP-адрес вашего сервера.
Apache установлен, следуя инструкциям по установке Apache в Ubuntu. Убедитесь, что у вас есть файл виртуального хоста для вашего домена. В этом руководстве в качестве примера будет использоваться /etc/apache2/sites-available/your_domain.conf
.
Шаг 1 — Установка Certbot
Чтобы получить SSL-сертификат с помощью Let’s Encrypt, вам необходимо установить программное обеспечение Certbot на свой сервер. Для этого вы будете использовать репозитории пакетов Ubuntu по умолчанию.
Сначала обновите индекс локального пакета:
sudo apt update
Вам понадобятся два пакета: certbot
и python3-certbot-apache
. Последний представляет собой плагин, который интегрирует Certbot с Apache, позволяя автоматизировать получение сертификата и настройку HTTPS на вашем веб-сервере с помощью одной команды:
sudo apt install certbot python3-certbot-apache
Вам будет предложено подтвердить установку, нажав Y
, затем ENTER
.
Certbot теперь установлен на вашем сервере. На следующем шаге вы проверите конфигурацию Apache, чтобы убедиться, что ваш виртуальный хост настроен правильно. Это гарантирует, что клиентский сценарий certbot
сможет обнаружить ваши домены и перенастроить ваш веб-сервер для автоматического использования только что созданного SSL-сертификата.
Шаг 2. Проверка конфигурации виртуального хоста Apache
Чтобы автоматически получить и настроить SSL для вашего веб-сервера, Certbot необходимо найти правильный виртуальный хост в файлах конфигурации Apache. Доменные имена вашего сервера будут получены из директив ServerName
и ServerAlias
, определенных в вашем блоке конфигурации VirtualHost
.
Если вы выполнили шаг по настройке виртуального хоста, описанный в руководстве по установке Apache, у вас должен быть настроен блок VirtualHost для вашего домена в /etc/apache2/sites-available/your_domain.conf
с уже установленными соответствующим образом директивами ServerName
, а также директивами ServerAlias
.
Чтобы убедиться, что все настроено, откройте файл виртуального хоста для вашего домена с помощью nano
или предпочитаемого вами текстового редактора:
sudo nano /etc/apache2/sites-available/your_domain.conf
Найдите существующие строки ServerName
и ServerAlias
. Они должны быть перечислены следующим образом:
...
ServerName your_domain
ServerAlias www.your_domain
...
Если у вас уже настроены ServerName
и ServerAlias
, вы можете выйти из текстового редактора и перейти к следующему шагу. Если ваша текущая конфигурация виртуального хоста не соответствует примеру, обновите ее соответствующим образом. Если вы используете nano
, вы можете выйти, нажав CTRL+X
, затем Y
и ENTER
для подтверждения. ваши изменения, если таковые имеются. Затем выполните следующую команду, чтобы подтвердить изменения:
sudo apache2ctl configtest
В ответ вы должны получить Syntax OK
. Если вы получили сообщение об ошибке, снова откройте файл виртуального хоста и проверьте наличие опечаток или пропущенных символов. Как только синтаксис вашего файла конфигурации станет правильным, перезагрузите Apache, чтобы изменения вступили в силу:
sudo systemctl reload apache2
Благодаря этим изменениям Certbot сможет найти правильный блок VirtualHost и обновить его.
Далее вы обновите брандмауэр, чтобы разрешить трафик HTTPS.
Шаг 3 — Разрешение HTTPS через брандмауэр
Если у вас включен брандмауэр UFW, как рекомендовано в руководствах по предварительным требованиям, вам необходимо настроить параметры, чтобы разрешить трафик HTTPS. После установки Apache регистрирует несколько различных профилей приложений UFW. Вы можете использовать профиль Apache Full, чтобы разрешить трафик HTTP и HTTPS на вашем сервере.
Чтобы проверить, какой трафик в настоящее время разрешен на вашем сервере, проверьте статус:
sudo ufw status
Если вы следовали одному из наших руководств по установке Apache, вы получите вывод, аналогичный следующему, что означает, что в настоящее время разрешен только HTTP-трафик через порт 80
:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache (v6) ALLOW Anywhere (v6)
Чтобы разрешить HTTPS-трафик, разрешите профиль «Apache Full»:
sudo ufw allow 'Apache Full'
Затем удалите лишний профиль «Apache»:
sudo ufw delete allow 'Apache'
Ваш статус будет отображаться следующим образом:
sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache Full (v6) ALLOW Anywhere (v6)
Теперь вы готовы запустить Certbot и получить сертификаты.
Шаг 4 — Получение SSL-сертификата
Certbot предоставляет различные способы получения SSL-сертификатов с помощью плагинов. Плагин Apache позаботится о перенастройке Apache и перезагрузке конфигурации при необходимости. Чтобы использовать этот плагин, выполните следующее:
sudo certbot --apache
Этот сценарий предложит вам ответить на ряд вопросов, чтобы настроить сертификат SSL. Сначала он попросит вас указать действующий адрес электронной почты. Этот адрес электронной почты будет использоваться для уведомлений о продлении и уведомлений о безопасности:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): you@your_domain
Указав действительный адрес электронной почты, нажмите ENTER
, чтобы перейти к следующему шагу. Затем вам будет предложено подтвердить, согласны ли вы с условиями обслуживания Let’s Encrypt. Вы можете подтвердить это, нажав Y
, а затем ENTER
:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Далее вас спросят, хотите ли вы поделиться своим адресом электронной почты с Electronic Frontier Foundation, чтобы получать новости и другую информацию. Если вы не хотите подписываться на их контент, напишите N
. В противном случае напишите Y
, затем нажмите ENTER
, чтобы перейти к следующему шагу:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N
На следующем шаге вам будет предложено сообщить Certbot, для каких доменов вы хотите активировать HTTPS. Перечисленные доменные имена автоматически получаются из конфигурации вашего виртуального хоста Apache, поэтому важно убедиться, что на вашем виртуальном хосте настроены правильные параметры ServerName
и ServerAlias
. Если вы хотите включить HTTPS для всех перечисленных доменных имен (рекомендуется), вы можете оставить это поле пустым и нажать ENTER
, чтобы продолжить. В противном случае выберите домены, для которых вы хотите включить HTTPS, перечислив каждый соответствующий номер, разделенный запятыми и/или пробелами, затем нажмите ENTER
:
Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: your_domain
2: www.your_domain
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):
После этого шага настройка Certbot будет завершена, и вам будут представлены последние замечания о вашем новом сертификате и о том, где найти сгенерированные файлы:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem
Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem
This certificate expires on 2022-07-10.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for your_domain to /etc/apache2/sites-available/your_domain-le-ssl.conf
Successfully deployed certificate for www.your_domain.com to /etc/apache2/sites-available/your_domain-le-ssl.conf
Congratulations! You have successfully enabled HTTPS on https:/your_domain and https://www.your_domain.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Теперь ваш сертификат установлен и загружен в конфигурацию Apache. Попробуйте перезагрузить сайт с помощью https://
и обратите внимание на индикатор безопасности вашего браузера. Он должен указывать на то, что ваш сайт должным образом защищен, обычно это значок замка в адресной строке.
Вы можете использовать тест сервера SSL Labs, чтобы проверить оценку вашего сертификата и получить подробную информацию о нем с точки зрения внешней службы.
На следующем и последнем этапе вы протестируете функцию автоматического продления Certbot, которая гарантирует, что ваш сертификат будет продлен автоматически до истечения срока действия.
Шаг 5 — Проверка автоматического продления Certbot
Сертификаты Let’s Encrypt действительны только в течение девяноста дней. Это сделано для того, чтобы побудить пользователей автоматизировать процесс обновления сертификатов, а также гарантировать, что срок действия неправильно использованных сертификатов или украденных ключей истечет раньше, чем позже.
Установленный вами пакет certbot
заботится о продлении, включая сценарий обновления в /etc/cron.d
, которым управляет служба systemctl
. называется certbot.timer
. Этот сценарий запускается два раза в день и автоматически продлевает любой сертификат, срок действия которого истекает в течение тридцати дней.
Чтобы проверить статус этой службы и убедиться, что она активна, выполните следующее:
sudo systemctl status certbot.timer
Ваш вывод будет похож на следующий:
● certbot.timer - Run certbot twice daily
Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset:>
Active: active (waiting) since Mon 2022-04-11 20:52:46 UTC; 4min 3s ago
Trigger: Tue 2022-04-12 00:56:55 UTC; 4h 0min left
Triggers: ● certbot.service
Apr 11 20:52:46 jammy-encrypt systemd[1]: Started Run certbot twice daily.
Чтобы протестировать процесс продления, вы можете выполнить пробный прогон с помощью certbot
:
sudo certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/your_domain.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Account registered.
Simulating renewal of an existing certificate for your_domain and www.your_domain.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/your_domain/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Если вы не получаете никаких ошибок, все готово. При необходимости Certbot обновит ваши сертификаты и перезагрузит Apache, чтобы принять изменения. Если процесс автоматического продления когда-либо завершится неудачей, Let’s Encrypt отправит сообщение на указанный вами адрес электронной почты, предупреждая вас о том, что срок действия вашего сертификата скоро истечет.
Заключение
В этом руководстве вы установили клиент Let’s Encrypt certbot
, настроили и установили сертификат SSL для своего домена и подтвердили, что служба автоматического продления Certbot активна в systemctl
. Если у вас есть дополнительные вопросы об использовании Certbot, их документация — хорошее место для начала.