Let's Encrypt - криптография становится ближе

  • Автор:

letsencrypt-overview-000.png

Повсеместный переход на защищенные соединения один из основных трендов последних лет. В связи с этим возникает вопрос получения, установки и своевременного продления сертификатов. Задача не сказать, чтобы сложная, но требующая определенных знаний, а также временных и финансовых затрат, что никак не способствовало широкому внедрению криптографии в массы. Так было до появления нового центра сертификации Let's Encrypt, основной задачей которого служит предоставление SSL-сертификатов всем желающим в автоматическом режиме и бесплатно.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Let's Encrypt управляется Internet Security Research Group (ISRG), которая является благотворительной организацией и ведет свою деятельность на благо общества. Основной целью компании является сокращение финансовых, технологических и образовательных барьеров на пути к безопасной связи через интернет. К основным спонсорам организации относятся такие компании, как Mozilla, Google, Cisco, Akamai и другие.

В основу своей деятельности Let's Encrypt ставит прозрачность: протокол взаимодействия с центром сертификации Automated Certificate Management Environment (ACME) и сам клиент открыты и распространяются под свободными лицензиями. Это является хорошим залогом безопасности, так как открытый код и открытый протокол взаимодействия резко снижают количество возможных необнаруженных уязвимостей или программных закладок, а также дают возможность всем желающим принять участие в дальнейшем развитии проекта.

В настоящий момент Let's Encrypt выдает только DV (Domain Validation) сертификаты, выпуск сертификатов с расширенным уровнем проверки не поддерживается. Срок действия сертификатов - 90 дней, перевыпуск осуществляется не ранее чем за месяц до окончания действия сертификата, т.е. при автоматизации этого процесса замена сертификатов будет происходить каждые два месяца. Столь короткий срок выбран для того, чтобы уменьшить возможные негативные последствия от возможной компрометации сертификата, не будем забывать, что сервис предназначен для самого широкого круга пользователей, многие из которых не обладают должным уровнем технических знаний.

Для работы с удостоверяющим центром Let's Encrypt используется клиентское ПО (Certbot), которое также может в автоматическом режиме конфигурировать веб-сервер (при помощи соответствующих плагинов). Т.е. во многих случаях для перехода сайта с HTTP на HTTPS будет вполне достаточно установить клиентское ПО и выполнить одну короткую команду.

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

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

Протокол ACME является клиент-серверным протоколом, работающим по принципу "запрос-ответ" и в настоящий момент предложен IETF (Инженерный совет Интернета) в качестве интернет стандарта.

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

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

letsencrypt-overview-001.pngЧтобы авторизовать ключевую пару клиент генерирует некий набор контактной информации, подписывает ее закрытым ключом и вместе с открытым ключом передает ее серверу. Сервер проверяет подлинность подписи в случае открытого ключа и передает клиенту подтверждение авторизации, после чего клиент может приступить к получению сертификатов.

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

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

letsencrypt-overview-002.pngЖелая получить сертификат клиент формирует стандартный запрос в формате PKCS#10 и подписав его закрытым ключом передает запрос удостоверяющему центру. Чтобы проверить владение доменом сервер удостоверяющего центра прежде всего проверяет подпись, а затем передает клиенту задание, скажем разместить в корневой директории сайта файл с именем roSg9ti6Y15j.

Клиент выполняет полученное задание и сообщает серверу о его выполнении. Сервер проверяет результат, в данном случае существование файла http://example.com/roSg9ti6Y15j и в случае успеха генерирует и передает клиенту сертификат.

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

Аналогично происходит и процедура отзыва сертификата.

letsencrypt-overview-003.pngКлиент формирует запрос на аннулирование сертификата, подписывает закрытым ключом и передает серверу. Сервер удостоверяющего центра производит отзыв и сообщает клиенту результат выполненной операции.

Как видим, протокол достаточно прост, но в тоже время обеспечивает необходимую надежность при проверке владения указанным доменом. Собственно, для данного типа сертификатов (DV) большего и не требуется, их предназначение - подтверждение того, что вы установили защищенное соединение именно с указанным в сертификате сайтом и соединение между вами безопасно.

Официальным ACME-клиентом является Certbot, взаимодействие с ним осуществляется с помощью специальных плагинов. В официальную поставку входит ряд плагинов, которые мы разберем подробнее.

Manual - плагин для ручной работы с серверами Let's Encrypt, особого интереса не представляет, разве что вы хотите самостоятельно разобраться как работает протокол ACME.

Standalone - полностью автономный плагин, не требующий вмешательства в ПО вашего сервера, имеет в составе собственный веб-сервер с помощью которого и происходит все взаимодействие с Let's Encrypt. Однако для работы с ним потребуется остановить ваш рабочий веб-сервер, что не всегда приемлемо. С другой стороны, его использование удобно для разработки и тестовых сред, когда требуется исключить привязку к конкретному ПО или расположениям файлов.

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

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

При запуске плагина ему передается путь к корневой директории сайта, сертификат для которого мы хотим получить, в файловой системе сервера. После чего Certbot создает там структуру директорий для хранения временных файлов:

${webroot-path}/.well-known/acme-challenge

Сервер Let's Encrypt поверяет наличие временного файла в указанном расположении запросом типа:

 http://example.com/.well-known/acme-challenge/HGr8U1IeTW4kY_Z6UIyaakzOkyQgPr_7ArlLgtZE8SX

Если временный файл существует, то владение доменом успешно подтверждено.

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

letsencrypt-overview-004.pngВ нашем примере мы запросили сертификат для имен example.com и forum.example.com, каждый из которых технически является самостоятельным сайтом и расположен в своей корневой директории, /var/www/example.com и /var/www/forum.example.com. Если мы укажем в качестве корневого пути папку одного из сайтов, скажем, /var/www/example.com, то example.com пройдет валидацию, а forum.example.com - не пройдет, так как расположение /var/www/forum.example.com/.well-khown не существует.

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

letsencrypt-overview-005.png

Создадим отдельную директорию, например, /var/www/letsencrypt, которую укажем в качестве корневой для Certbot. А для каждого из сайтов настроим алиас для .well-khown, чтобы при запросе данного расположения веб-сервер реально обращался к директории /var/www/letsencrypt. Данный подход удобен тем, что в настройках Certbot будет указан путь к собственной директории, это позволяет впоследствии изменять расположение директорий на сервере, не затрагивая настройки для получения и продления сертификата.

Кроме вышеперечисленных также существуют плагины от сторонних разработчиков для работы с иными системами, например, системой виртуализации Proxmox или почтовыми серверами Postfix/Exim.

В дальнейших наших материалах, когда мы будем рассматривать практическую работу с сертификатами Let's Encrypt мы будем подразумевать, что читатель располагает базовым объемом знаний, как минимум на уровне данной статьи.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Дополнительные материалы:


  1. Let's Encrypt - криптография становится ближе
  2. Получаем сертификаты Let's Encrypt при помощи Certbot

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Поддержи проект!

Или подпишись на наш Телеграм-канал: Подпишись на наш Telegram-канал



Loading Comments