Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Использование клиента LetsEncrypt из репозитория дистрибутива Fedora

Оригинал: LetsEncrypt now available in Fedora
Автор: James Hogarth
Дата публикации: 14 декабря 2015 г.
Перевод: А.Панин
Дата перевода: 7 мая 2016 г.

Использование клиента LetsEncrypt

Не так давно началось открытое бета-тестирование проекта LetsEncrypt. Благодаря работе участников команды LetsEncrypt и разработчиков дистрибутива Fedora, официальный клиент LetsEncrypt был незамедлительно размещен в репозиториях Fedora 23 и Rawhide. Если вы хотите узнать подробнее о том, как он работает и для чего предназначен, вы можете обратиться к соответствующему разделу официального сайта проекта. В данной же статье мы рассмотрим процесс настройки веб-сервера Apache с целью использования сертификата проекта LetsEncrypt для шифрования HTTP-трафика.

Проект LetsEncrypt предоставляет бесплатные сертификаты SSL всем желающим

Проект LetsEncrypt предоставляет бесплатные сертификаты SSL всем желающим

Использование клиента letsencrypt в дистрибутиве Fedora

Официальный клиент letsencrypt может быть установлен в Fedora 23 и более новых версиях дистрибутива с помощью следующей команды:

dnf install letsencrypt

Официальный клиент поддерживает три метода подтверждения прав владения доменом:

  • Подтверждение в ручном режиме: файлы сертификата должны размещаться в соответствующей директории веб-сервера силами его администратора.
  • Подтверждение силами клиента: клиент LetsEncrypt принимает соединения от сервера на портах 80 и 443 и самостоятельно взаимодействует с ним.
  • Подтверждение путем создания файлов в корневой директории веб-сервера: клиент получает информацию о корневой директории веб-сервера (например, /var/www/html) и самостоятельно создает в ней все необходимые файлы.

На момент написания статьи инструменты для полностью автоматизированной настройки веб-серверов Apache и nginx находятся в разработке.

После окончания процесса установки упомянутого пакета программного обеспечения у вас появится возможность ознакомления с полным списком поддерживаемых клиентом аргументов командной строки благодаря наличию поддержки аргумента --help:

letsencrypt --help all

Подтверждение прав владения доменом в ручном режиме

Данный метод подтверждения прав владения доменом связан с наибольшими затратами времени, но в то же время, он позволяет запускать клиент LetsEncrypt в отдельной системе и впоследствии копировать файлы сертификата на веб-сервер. В зависимости от выбранной вами модели обеспечения безопасности веб-сервера, он может оказаться предпочтительным.

По умолчанию клиент использует интерфейс на основе библиотеки ncurses, но он также может работать в обычном текстовом режиме:

$ letsencrypt --text --email recovery@example.com \
--domains www.example.com,example.com,foo.example.com \
--agree-tos --renew-by-default --manual certonly

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

В том случае, если перечисляется множество имен доменов, они будут включены в раздел SubjectAltNames одного сертификата.

После исполнения данной команды клиент попросит вас создать файл с секретными данными по заданному пути. Выполните следующие команды для генерации этого файла (замените "somethingrandomgivenbyservergoeshere" на выданные клиентом секретные данные, а "anotherrandomthinghere" - на выданное клиентом имя файла).

$ cd /var/www/html
$ mkdir -p .well-known/acme-challenge
$ echo "somethingrandomgivenbyservergoeshere" > .well-known/acme-challenge/anotherrandomthinghere

После подтверждения факта размещения файла с секретными данными по заданному пути сервер ACME проверит его наличие. При совпадении имени файла и секретных данных в нем, проект LetsEncrypt выдаст вам сертификат. Это сертификат должен будет либо перемещен, либо связан с помощью символьной ссылки с соответствующей директорией для его автоматического обновления.

Подтверждение прав владения доменом силами клиента

Данный метод подтверждения прав владения доменом позволяет выполнять все описанные выше действия в автоматическом режиме, который обуславливает возможность полной автоматизации процесса обновления сертификата. Его недостатком является необходимость временной остановки основного веб-сервера для того, чтобы клиент LetsEncrypt мог запустить свой встроенный HTTP-сервер и передать секретные данные основному серверу проекта.

IP-адрес машины, с которой отправляется запрос на подтверждение прав владения доменом силами клиента должен совпадать с IP-адресом, указанным в записи A этого домена, следовательно, клиент должен запускаться непосредственно на веб-сервере, для которого создается сертификат.

$ letsencrypt --text --renew-by-default --email recovery@example.com \
--domains www.example.com,example.com,foo.example.com \
--agree-tos --standalone --standalone-supported-challenges http-01 certonly

Со стороны пользователя не требуется никаких действий. Данный метод подтверждения прав владения доменом может использоваться в автоматическом режиме при условии наличия свободного порта 80 или 443, а также тогда, когда допустим небольшой период бездействия веб-сервера. Например, он может использоваться на этапе начальной настройки перед запуском основного веб-сервера в случае работы с такой автоматизированной системой управления, как Ansible.

После получения сертификата сервер должен быть соответствующим образом настроен для его использования.

Подтверждение прав владения доменом путем создания файлов в корневой директории веб-сервера

Данный метод является удобным компромиссом. В том случае, если существующий веб-сервер обслуживает клиентов, клиент LetsEncrypt может получить от пользователя путь к его корневой директории и автоматически создать файл с секретными данными для сервера ACME. Данный метод подтверждения прав владения доменом также предполагает отправку запроса с IP-адреса, соответствующего IP-адресу, который приведен в записи A указанного домена.

$ letsencrypt --text --renew-by-default --email recovery@example.com \
--domains www.example.com,example.com,foo.example.com \
--agree-tos --webroot --webroot-path /var/www/html certonly

Подтверждение прав владения доменом путем создания файлов в корневой директории веб-сервера

Использование сертификата LetsEncrypt

После успешного подтверждения прав владения доменом в директории /etc/letsencrypt будут созданы файлы с информацией о выбранном методе подтверждения, а также данными использованных ключей, сертификата и использованного запроса.

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

Конфигурация расширения mod_ssl может быть осуществлена следующим образом:

$ ln -s /etc/letsencrypt/live/www.example.com/cert.pem /etc/pki/tls/certs/www.example.com.crt
$ ln -s /etc/letsencrypt/live/www.example.com/chain.pem /etc/pki/tls/certs/www.example.com.chain.crt
$ ln -s /etc/letsencrypt/live/www.example.com/privkey.pem /etc/pki/tls/private/www.example.com.key
$ cp /etc/httpd/conf.d/ssl.conf{,.backup}
$ sed -i 's@\(SSLCertificateFile\) .*@\1 /etc/pki/tls/certs/www.example.com.crt@' /etc/httpd/conf.d/ssl.conf
$ sed -i 's@\(SSLCertificateKeyFile\) .*@\1 /etc/pki/tls/private/www.example.com.key@' /etc/httpd/conf.d/ssl.conf
$ sed -i 's@#\(SSLCertificateChainFile\) .*@\1 /etc/pki/tls/certs/www.example.com.chain.crt@' /etc/httpd/conf.d/ssl.conf

После перезапуска веб-сервера он должен использовать сгенерированный сертификат.

Для файлов сертификатов из используемой по умолчанию директории устанавливается контекст SELinux etc_t. Они могут читаться серверами httpd и nginx, поэтому описанная конфигурация будет вполне работоспособной. Однако, пока в базовом наборе политик SELinux не реализовано поддержки контекста для сертификатов LetsEncrypt, имеет смысл установить подходящий контекст для файлов сертификата вручную, чтобы предотвратить любые злонамеренные действия.

$ semanage fcontext -a -t cert_t '/etc/letsencrypt/(archive|live)(/.*)?'
$ restorecon -Rv /etc/letsencrypt

Обновление сертификата

Срок действия выдаваемых сертификатов ограничивается 90 днями для того, чтобы сертификаты, выданные недобросовестным пользователям, становились недействительными максимально быстро. Также ведутся дискуссии о сокращении срока действия сертификатов в будущем. Разумеется, разработчики предполагают, что пользователи будут автоматизировать процесс получения сертификатов и обновлять их через каждые 30 или 60 дней для того, чтобы постоянно использовать свежий сертификат, действительный в течение 90 дней.

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

Файлы в поддиректории live являются всего лишь символьными ссылками на текущие версии соответствующих файлов из поддиректории /etc/letsencrypt/archive. Они позволяют отслеживать историю обновления версий сертификатов и осуществлять откаты обновлений при необходимости.

$ ls -1 /etc/letsencrypt/archive/www.example.com
 cert1.pem
 cert2.pem
 chain1.pem
 chain2.pem
 fullchain1.pem
 fullchain2.pem
 privkey1.pem
 privkey2.pem

$ ls -lGg /etc/letsencrypt/live/www.example.com
 lrwxrwxrwx. 1 41 Dec 2 23:19 cert.pem -> ../../archive/www.example.com/cert2.pem
 lrwxrwxrwx. 1 42 Dec 2 23:19 chain.pem -> ../../archive/www.example.com/chain2.pem
 lrwxrwxrwx. 1 46 Dec 2 23:19 fullchain.pem -> ../../archive/www.example.com/fullchain2.pem
 lrwxrwxrwx. 1 44 Dec 2 23:19 privkey.pem -> ../../archive/www.example.com/privkey2.pem

Для использования новых версий файлов следует просто перезапустить веб-сервер. Если вы используете метод подтверждения прав владения доменом, который не требует взаимодействия с веб-сервером, такой, как метод подтверждения путем создания файлов в корневой директории веб-сервера, это процесс может быть автоматизирован с помощью задачи cron или таймера systemd.

Пример создания таймера systemd:

Отзыв сертификата

При неблагоприятном стечении обстоятельств закрытый ключ может попасть в руки злоумышленников. В подобных ситуациях следует отзывать сертификат для того, чтобы кто-либо не смог скомпрометировать веб-сервер. Учтите, что в процессе обновления сертификатов не происходит их отзыва, ведь сервер должен иметь возможность использовать старый сертификат в течение некоторого промежутка времени после его обновления до момента перезапуска или получения файлов нового сертификата.

Для отзыва сертификата следует использовать клиент с аргументом revoke:

$ letsencrypt revoke --cert-path /etc/letsencrypt/archive/www.example.com/cert1.pem

В случае ошибки в процессе отзыва сертификата клиент сообщит о ней. В противном случае сертификат будет отозван!

Заключительные слова

Платформа LetsEncrypt вошла в фазу открытого бета-тестирования и постоянно дорабатывается. Важно периодически заглядывать в официальную документацию проекта для того, чтобы быть в курсе изменений функций официального клиента. Также следует обратить внимание на то, что некоторые команды и аргументы, описанные в официальной документации проекта, такие, как команда для автоматического обновления клиента, а также плагин для создания файла конфигурации Apache, не поддерживаются клиентом из репозитория дистрибутива Fedora.

В том случае, если вы обнаружите ошибку в версии клиента из репозитория Fedora, пожалуйста, сообщите о ней в систему отслеживания ошибок для того, чтобы разработчики дистрибутива смогли исправить ее, упростив тем самым жизнь пользователей, которые будут работать с ним в будущем.