Библиотека сайта rus-linux.net
Использование клиента LetsEncrypt из репозитория дистрибутива Fedora
Оригинал: LetsEncrypt now available in Fedora
Автор: James Hogarth
Дата публикации: 14 декабря 2015 г.
Перевод: А.Панин
Дата перевода: 7 мая 2016 г.
Не так давно началось открытое бета-тестирование проекта LetsEncrypt. Благодаря работе участников команды LetsEncrypt и разработчиков дистрибутива Fedora, официальный клиент LetsEncrypt был незамедлительно размещен в репозиториях Fedora 23 и Rawhide. Если вы хотите узнать подробнее о том, как он работает и для чего предназначен, вы можете обратиться к соответствующему разделу официального сайта проекта. В данной же статье мы рассмотрим процесс настройки веб-сервера Apache с целью использования сертификата проекта LetsEncrypt для шифрования HTTP-трафика.
Проект 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, пожалуйста, сообщите о ней в систему отслеживания ошибок для того, чтобы разработчики дистрибутива смогли исправить ее, упростив тем самым жизнь пользователей, которые будут работать с ним в будущем.