Введение
Этот урок покажет вам, как настроить TLS/SSL сертификат от Let’s Encrypt на сервере CentOS 7 под управлением Apache в качестве веб-сервера. Кроме того, мы рассмотрим, как автоматизировать процесс обновления сертификата с помощью cron задачи.
SSL сертификаты используются на веб-серверах для шифрования трафика между сервером и клиентом, обеспечивая дополнительную безопасность для пользователей, имеющих доступ к вашим приложениям. Let’s Encrypt обеспечивает простой способ получить и установить доверенные сертификаты бесплатно.
Требования
Для того, чтобы завершить это руководство, вам потребуется:
-
CentOS 7 сервер с некорневым sudo пользователем, который вы можете настроить, следуя нашим руководством по установке сервера
-
Веб-сервер Apache установлен с одним или несколькими правильно настроенными доменными именами
Для целей данного руководства, мы установим Let’s Encrypt сертификат для домена example.com. Это будет в качестве примера по всему руководстве, но вы должны заменить его с вашим собственным доменом.
Когда вы будете готовы двигаться дальше, необходимо войти в ваш сервер, используя учетную запись sudo.
Шаг 1. Создание виртуального хостинга для вашего домена
Apache плагин для Let’s Encrypt значительно упрощает процесс создания и установки SSL-сертификатов для доменов с Apache. Тем не менее, на момент написания этой статьи, необходимо, чтобы у вас были ваши домены организованы в виртуальные хосты, каждый из них в отдельном файле конфигурации.
Если домен уже настроен в качестве виртуального хоста в отдельном файле конфигурации, вы можете перейти к следующему шагу.
Создание структуры каталогов
Мы начнем с создания новой структуры каталогов для хранения ваших файлов виртуальных хостов внутри каталога конфигурации Apache, /etc/httpd. Мы будем следовать стандартной структуре введенной дистрибутивами на основе Debian, что делает более легким включение и отключение сайтов, которые настроены в качестве виртуальных хостов внутри Apache.
Доступ к каталогу конфигурации Apache с:
$ cd /etc/httpd
Во-первых, создайте каталог, который будет содержать все доступные сайты на этом сервере:
$ sudo mkdir /etc/httpd/sites-available
Далее, создайте каталог, который будет вмещать активные в данный момент (включенные) веб-сайты, размещенных на этом сервере. Этот каталог будет содержать только символические ссылки на файлы виртуальных хостов, расположенных внутри /etc/httpd/sites-available.
$ sudo mkdir /etc/httpd/sites-enabled
Теперь нам нужно сообщить Apache, как найти файлы виртуальные хостов. Для достижения этой цели мы будем редактировать основной конфигурационный файл Apache и добавлять строку, объявляя дополнительный каталог для дополнительных конфигурационных файлов. С помощью командной строки вашего любимого текстового редактора, откройте файл /etc/httpd/conf/httpd.conf:
$ sudo nano /etc/httpd/conf/httpd.conf
Добавьте эту строку в конец файла:
IncludeOptional sites-enabled/*.conf
Сохраните и закройте файл, когда добавите эту строку.
Создание нового файла виртуального хоста
Следующим шагом является создание файла конфигурации виртуального хоста. С помощью командной строки вашего любимого текстового редактора, создайте новый файл под /etc/httpd/sites-available. Мы назовем файл example.com.conf, но вы можете выбрать любое имя. Важно, однако, чтоб файл заканчивался расширением .conf.
$ sudo nano /etc/httpd/sites-available/example.com.conf
Добавьте следующее содержимое в файл, заменив example.com вашим собственным доменом:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/html
ErrorLog /var/log/apache/example.com/error.log
</VirtualHost>
Сохраните файл и выйдите. Ниже вы можете найти краткое описание каждой опции конфигурации, используемой для этого примера:
-
ServerName: имя вашего главного домена.
-
ServerAlias (optional): алиас для основного домена. Это обычная практика, чтобы добавить WWW субдомен в качестве алиаса (псевдонима) основного домена.
-
DocumentRoot: место, где должны быть найдены файлы веб-сайта. В конфигурации Apache по умолчанию на CentOS 7, главный корневой документ, как правило, /var/www/html, но вы можете изменить это значение, если вы хотите разместить файлы сайта в другом месте на сервере.
-
ErrorLog (необязательно): пользовательское место для ведения журнала ошибок, характерных для данного виртуального хоста. Если вы не укажете эту опцию, ошибки будут регистрироваться в журнале ошибок Apache по умолчанию: /var/log/httpd/error_log.
Включение виртуального хоста
Файл виртуального хоста сейчас создается, но нам все еще нужно сказать Apache, что мы хотим чтобы этот сайт был включен. Чтобы добиться этого, нам нужно создать символическую ссылку внутри sites-enabled, указывающую на новый файл конфигурации виртуального хоста. Запустите:
$ sudo ln -s /etc/httpd/sites-available/example.com.conf /etc/httpd/sites-enabled/example.com.conf
Таким образом, всякий раз, когда вы хотите, чтобы отключить виртуальный хост, вы можете просто удалить ссылку внутри sites-enabled и перезагрузить службу Apache, сохраняя исходный файл виртуального хоста внутри sites-available для любых будущих нужд.
Если ваш домен был предварительно настроен в качестве основного веб-сайта Apache внутри файла httpd.conf, важно удалить старую конфигурацию из этого файла, чтобы избежать неожиданного поведения при генерации сертификата SSL.
Откройте файл /etc/httpd/conf/httpd.conf и ищите директивы ServerName и ServerAlias. Если они установлены в том же домене, который вы настроили в качестве виртуального хоста, вы должны закомментировать их, добавив знак # в начале строки:
$ sudo nano /etc/httpd/conf/httpd.conf
# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
#
#ServerName example.com:80
#ServerAlias www.example.com
Все, что осталось сделать сейчас - это перезапустить Apache, чтобы изменения вступили в силу:
$ sudo systemctl restart httpd
Шаг 2. Установка зависимостей сервера
Прежде чем мы сможем установить Let’s Encrypt клиент и сгенерировать сертификат SSL, нам нужно установить несколько зависимостей на сервере CentOS.
Во-первых, установите репозиторий EPEL (Extra Packages for Enterprise Linux):
$ sudo yum install epel-release
Нам понадобится git, чтобы загрузить Let’s Encrypt клиент. Для установки git, выполните следующую команду:
$ sudo yum install git
Теперь вы должны быть готовы следовать остальной части этого руководства.
Шаг 3. Скачивание Let’s Encrypt клиента
Далее, мы будем загружать Let’s Encrypt клиент с официального репозитория, помещая свои файлы в специальном месте на сервере. Мы будем делать это, чтобы облегчить процесс обновления файлов репозитория, когда будет доступна новая версия. Поскольку Let’s Encrypt клиент все еще находится в бета-версии, могут потребоваться частые обновления для исправления ошибок и реализации новые функциональных возможностей.
Мы скопируем репозиторий Let’s Encrypt в /opt, который является стандартный каталогом для размещения программного обеспечения сторонних производителей на системах Unix:
$ sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
Это создаст локальную копию официального репозитория Let’s Encrypt под /opt/letsencrypt.
Шаг 4. Настройка SSL-сертификата
Создание SSL сертификата для Apache с помощью Let’s Encrypt клиента довольно простое. Клиент автоматически получит и установит новый сертификат SSL, который действителен для доменов, предоставленных в качестве параметров.
Доступ к каталогу letsencrypt:
$ cd /opt/letsencrypt
Чтобы выполнить интерактивную установку и получить сертификат, который охватывает только один домен, выполните команду letsencrypt-auto:
$ ./letsencrypt-auto --apache -d example.com
Если хотите установить один сертификат, который действителен для нескольких доменов или поддоменов, вы можете указать их в качестве дополнительных параметров команды. Первое доменное имя в списке параметров будет базовый домен, используемый Let’s Encrypt для создания сертификата, и по этой причине мы рекомендуем вам указать голое доменное имя верхнего уровня первым в списке, а затем - любые дополнительные поддомены или алиасы (псевдонимы):
$ ./letsencrypt-auto --apache -d example.com -d www.example.com
Для этого примера, базовым доменом будет example.com.
После того, как зависимости будут установлены, вам будет представлено пошаговое руководство, чтобы настроить параметры сертификата. Вам будет предложено указать адрес электронной почты для уведомлений и восстановления потерянного ключа, и вы будете иметь возможность выбирать между включением и http и https доступа; или перенаправлять все запросы на https.
Когда установка успешно завершена, вы должны увидеть сообщение, похожее на это:
Output:
IMPORTANT NOTES:
- If you lose your account credentials, you can recover through
e-mails sent to [email protected]
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your
cert will expire on 2016-03-15. To obtain a new version of the
certificate in the future, simply run Let's Encrypt again.
- Your account credentials have been saved in your Let's Encrypt
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 Let's
Encrypt so making regular backups of this folder is ideal.
- If like Let's Encrypt, 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.
Организация ваших виртуальных хостов
Плагин Apache для Let’s Encrypt создает новый виртуальный хост-файл для обеспечения доступа по протоколу https для вашего домена. Это делается автоматически с помощью клиента при создании сертификата с помощью плагина Apache. Тем не менее, файл создается внутри sites-enabled, каталога, который должен содержать только ссылки для реальных файлов виртуальных хостов, которые расположены внутри каталога sites-available.
Чтобы сохранить ваши файлы виртуальных хостов организованными и в соответствии со значениями по умолчанию, вы можете переместить этот новый файл виртуального хоста в каталог sites-available и создать символическую ссылку внутри sites-enabled:
$ sudo mv /etc/httpd/sites-enabled/example.com-le-ssl.conf /etc/httpd/sites-available/example.com-le-ssl.conf
$ sudo ln -s /etc/httpd/sites-available/example.com-le-ssl.conf /etc/httpd/sites-enabled/example.com-le-ssl.conf
Ваш каталог sites-enabled должен выглядеть примерно следующим образом:
lrwxrwxrwx 1 root root 48 Jan 25 12:37 example.com.conf -> /etc/httpd/sites-available/example.com.conf
lrwxrwxrwx 1 root root 55 Jan 25 12:44 example.com-le-ssl.conf -> /etc/httpd/sites-available/example.com-le-ssl.conf
Перезапустите Apache, чтобы применить изменения:
$ sudo systemctl restart httpd
Проверка состояния сертификата
Вы можете проверить статус вашего SSL сертификата по следующей ссылке (не забудьте заменить example.com вашим базовим доменом):
https://www.ssllabs.com/ssltest/analyze.html?d=example.com&latest
Теперь вы должны иметь возможность получить доступ к веб-сайту, используя префикс https.
Шаг 5. Настройка автопродления
Сертификат Let’s Encrypt действителен 90 дней, но рекомендуется продлевать срок действия сертификатов каждые 60 дней, чтобы обеспечить предел погрешности. Let's Encrypt клиент имеет комманду renew, которая автоматически проверяет установленные сертификаты и пытается продлить их, если осталось менее чем за 30 дней от даты истечения срока годности.
Чтобы запустить процесс обновления для всех установленных доменов, выполните следующую команду:
./letsencrypt-auto renew
Так как мы недавно установили сертификат, то команда будет проверять только дату истечения срока действия и выдаст сообщение, уведомляющее о том, что сертификат еще продлевать не надо. Результат должен выглядеть примерно следующим образом:
Checking for new version...
Requesting root privileges to run letsencrypt...
/root/.local/share/letsencrypt/bin/letsencrypt renew
Processing /etc/letsencrypt/renewal/example.com.conf
The following certs are not due for renewal yet:
/etc/letsencrypt/live/example.com/fullchain.pem (skipped)
No renewals were attempted.
Обратите внимание, что если вы создали сертификат в комплекте с несколькими доменами, только базовое имя домена будет показано на выходе, но обновление должно быть действительным для всех доменов, включенных в этот сертификат.
Практический способ убедиться, что ваши сертификаты не будут устаревать - это создать cron задачу, которая будет периодически выполнять автоматическую команду продления для вас. Поскольку обновление сначала проверяет на дату истечения срока действия и только выполняет обновление сертификата менее чем за 30 дней от истечения срока действия, безопасно создать cron задачу, которая работает каждую неделю или даже каждый день, например.
Давайте отредактируем crontab, чтобы создать новую задачу, которая будет выполнять команду обновление каждую неделю. Для редактирования crontab для корневого пользователя, выполните следующую команду:
$ sudo crontab -e
Включите следующее содержимое, все в одной строке:
30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log
Сохраните и выйдите. Это создаст новую cron задачу, которая будет выполнять letsencrypt-auto renew команду каждый понедельник в 2:30 утра, и перезагружать Nginx в 2:35 утра (поэтому обновленный сертификат будет использоваться). Вывод, генерируемый командой будет поступать в лог-файл, расположенный в /var/log/le-renewal.log.
Шаг 6. Обновление Let’s Encrypt клиента (не обязательно)
Каждый раз, когда будут доступны новые обновления для клиента, вы можете обновить локальную копию, запустив git pull изнутри каталога Let’s Encrypt:
$ cd /opt/letsencrypt
$ sudo git pull
Это позволит загрузить все последние изменения в хранилище, обновив ваш клиент.
Заключение
В этом руководстве, мы увидели, как установить бесплатный SSL сертификат от Let’s Encrypt для защиты веб-сайта, размещенного на сервере CentOS 7 с Apache. Поскольку Let’s Encrypt client все еще находится в бета-версии, мы рекомендуем вам время от времени проверять официальный блог Let’s Encrypt на наличие обновлений.