Что такое Let’s Encrypt или бесплатные TLS сертификаты

Думаю, всем, кто хоть раз занимался переводом сайта на https, приходилось сталкиваться с различными проблемами в этой области. Начиная от, мягко говоря, не очень быстрой процедуры подтверждения домена, до финансовых вложений за, весьма сомнительную услугу - добавления вами же созданного ключа в удостоверяющий центр. А если вам необходим wildcard-сертификат (один для всего подмножества доменов следующего уровня, к примеру *.alexxkn.ru), да ещё и нет возможности оплатить по безналичному расчёту в валюте...

В общем, если вы читаете это, значит вам скорее всего тоже это всё надоело и вы уже слышали про проект Let’s Encrypt. Сначала я хотел написать статью о том как сие устанавливать, как пользоваться и прочее и, конечно же, описать как это всё работает, но оказалось, что достаточно просто выложить перевод и так отличной статьи с официального сайта. К тому же объём и так получился хороший, так что, различные рецепты будут вынесены в отдельную статью, а пока...

Вашему вниманию представляются:

Участники:

  • Let’s Encrypt – некоммерческий удостоверяющий центр, который начал работать в тестовом режиме с 3 декабря 2015 года и предоставлять бесплатные X.509 сертификаты для TLS шифрования с помощью автоматизированного процесса, направленного на замену текущего сложного процесса ручного создания, проверки, подписи, установки и обновления сертификатов для защищённых веб-сайтов;
  • ACME (Automated Certificate Management Environment) представляет собой протокол для автоматизированного управления сертификатами подтверждения домена, основанный на простом JSON-over-HTTPS интерфейсе;
  • УЦ (CA) — удостоверяющий центр;
  • PKCS (Public Key Cryptography Standarts) — cтандарты криптографии с открытым ключом;
  • PKCS #10 (CRS, Certification Request Standard) — стандарт отправки запроса нового сертификата;
  • OCSP (Online Certificate Status Protocol) - протокол для проверки статуса сертификата на предмет отозванности;
  • CRL - список отозванных сертификатов с указанием времени. Он подписывается УЦ и свободно распространяется через общедоступный репозиторий.

Технология

Цель Let’s Encrypt и ACME протокола сделать возможным настройку HTTPS соединения сервера и автоматически получать доверенный сертификат, без участия человека. Всё это достигается путём запуска агента управления сертификатами на веб-сервере.
Для понимая того, как работает технология, давай-те рассмотрим процесс создания https страницы с использованием агента управления сертификатами, который поддерживает Let’s Encrypt.
Процесс состоит из двух шагов. Сначала, агент подтверждает для удостоверяющего центра, что веб-сервер контролирует домен. Далее, агент может отправить запрос на создание, пересоздание или удаление сертификата домена.

Проверка домена

Let’s Encrypt идентифицирует администратора сервера по публичному ключу. В первый раз программный агент, взаимодействуя с Let’s Encrypt, генерирует новую пару ключей и уведомляет УЦ Let’s Encrypt, что сервер контролирует один или несколько доменов. Это похоже на традиционный процесс создания учетной записи удостоверяющего центра и добавление доменов для этой учетной записи.
Для начала процесса агент делает запрос в УЦ Let’s Encrypt на подтверждение владения доменом. УЦ Let’s Encrypt проверяет доменное имя и выдаёт один или несколько вариантов подтверждения. Есть несколько способов, чтобы агент мог подтвердить контроль над доменом. Например, УЦ может дать агенту выбор:

  • определить «А»-запись для домена или
  • разместить HTTP ресурс в рамках известного URI для домена (разместить файле по указанному пути на сайте (прим. перев))

Наряду с эти вариантами, УЦ Let’s Encrypt так же отправляет случайное число, который агент должен подписать своим закрытым ключом для проверки достоверности пары ключей («открытый-закрытый» ключи).

Программный агент завершает один из вариантов подтверждения. Допустим, агент выполнил вторую задачу и создал файл по указанному пути на сайте. Агент так же подписывает случайное число своим закрытым ключом. Когда агент завершает этот шаг, он сообщает УЦ, что готов к проверки контроля доменного имени.

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

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

Выдача сертификата и аннулирования

С момента, как агент имеет авторизованную в УЦ пару ключей, выпуск, перевыпуск и удаление сертификатов элементарно — менеджер сертификатов просто отправляется сообщение и подписывается авторизованной парой ключей.
Для получения сертификата, агент создаёт PKCS#10 сообщение, для выдачи УЦ Let’s Encrypt сертификата для домена с указанным открытым ключом. Как обычно, CRS включает подпись персональным ключом, соответствующим открытому ключу CRS. Агент также подписывает весь CRS запрос, авторизованным в УЦ, ключом для домена, чтобы УЦ Let’s Encrypt знал, что ему это разрешено.
Когда УЦ Let’s Encrypt получает запрос, он проверяет все подписи. Если всё хорошо, он выписывает сертификат для домена с публичным ключом из CRS запроса и возвращает его агенту.

Аннулирование работает аналогичным образом. Агент подписывает запрос на аннулирование авторизованными ключами и УД проверяет, что запрос разрешён. Если это так, он публикует информацию в CRLs, так что полагающиеся стороны, такие как браузеры, могут узнать, что они не должны принимать отозванный сертификат.

Важно!
Пока система работает в beta-версии, Let’s Encrypt строго ограничивает количество сертификатов для одного доменного имени. Рекомендуется сначала использовать тестовый сервер, с помощью команды --test-cert, пока вы не получите желаемый сертификат.

letsencrypt-auto рекомендуемый метод для запуска клиентской части Let’s Encrypt на системах, которые не имеют соответствующих пакетов. Debian, Arch Linux, Gentoo, FreeDSB, Centos и OpenBSD теперь имеют собственные пакеты, так что в перечисленных ОС, вы можете просто установить letsencrypt (и, возможно, letsencrypt-apache). Если вам больше нравится использовать последнюю копию из git-репозитория или вашу локальную изменённую версию клиентской части, следуйте инструкциям в Руководстве разработчика.
Let’s Encrypt выпускает краткосрочные сертификаты (90 дней). Убедитесь, что вы перевыпускаете сертификат по крайней мере раз в три месяца.

О лимитах beta-версии
(Со страниц community. Раздел "Rate Limits for Let’s Encrypt".)

  1. Имена / Сертификаты. Ограничение связано с тем, сколько доменных имен вы можете включить в один сертификат. В настоящее время это ограничивается 100 именами, включённым в один сертификат;
  2. Сертификаты / Домены. Ограничение связано с многократным выпуском сертификата для любого уровня одного домена. Можно выписать лишь 5 сертификатов в неделю для любого уровня одного домена (например, сертифкаит на domain.ru+www,domain.ru, сертификат на host1.domain.ru+www.host1.domain.ru - это два сертификата из пяти);
  3. Регистрация / IP-адрес. Ограничение связано с числом регистраций, которые вы можете сделать в определенный период времени. В настоящее время это 500 за 3 часа;
  4. Авторизация, ожидающая решения / учётная запись. Ограничено количеством раз, которое АСМЕ клиент может запрашивать доменное имя, будучи авторизованным без актуального заполненияданных. Это часто встречается при разработка АСМЕ клиентов, и этот лимит устанавливается до 300 для 1 аккаунта в неделю.

О клиентском приложении Let’s Encrypt

Клиент Let’s Encrypt - это полнофункциональное расширяемое клиентское ПО для УЦ Let’s Encrypt (или любых других УЦ, которые работают по протоколу ACME), которое может автоматически выписать сертификат и настроить веб-сервер, для использования его.

Установка

Если letsencrypt есть в пакете для вашей ОС, вы можете установить его от туда (например, используя apt-get или yum) и запустить, вызвав команду letsencrypt. Из-за того, что не все ОС ещё получили данный пакет, мы подготовили временное решение letsencrypt-auto через обёрточный скрипт, который подтягивает некоторые зависимости из вашей ОС и устанавливает недостающее в виртуальное окружение python (python virtual environment).

user@webserver:~$ git clone https://github.com/letsencrypt/letsencrypt
user@webserver:~$ cd letsencrypt
user@webserver:~/letsencrypt$ ./letsencrypt-auto --help

Или для вывода полной страницы помощи:

./letsencrypt-auto --help all

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

Как работает клиентская часть

Во многих случаях, вы можете просто запустить letsencrypt-auto или letsencrypt и клиент проведёт вас через процесс получения и установки сертификата в интерактивном режиме.
Вы так же можете сказать, что именно хотите, через использование командной строки. Например, если вы хотите выпустить сертификат для доменных имён example.com, www.example.com и other.example.com, используя Apache модуль и для получения и для установки сертификатов, вы должны сделать следующее:

./letsencrypt-auto --apache -d example.com -d www.example.com -d other.example.net

(Первый раз запустив команду, она будет создавать учётную запись и спрашивать адрес электронной почты и подтверждения соглашения Let’s Encrypt Subscriber Agreement; вы можете автоматически выполнить это с помощью команд --email и --agree-tos)
Если вы хотите использовать веб-сервер, который ещё не имеет полнофункционального расширения, вы можете использовать standalone или webroot расширение для получения сертификата:

./letsencrypt-auto certonly --standalone --email admin@example.com -d example.com -d www.example.com -d other.example.net

Расширения

Клиентская часть Let’s Encrypt поддерживает несколько различных расширения, которые могут быть использованы для получения и/или установки сертификатов. Расширения, которые могут выписать сертификат называются Аутентификаторы (authenticators) и могут быть использованы с аргументом certonly. Расширения, которые могут установить сертификат называются установщики (installers). Расширения, которые умеют и то и другое могут быть использованы с аргументов letsencrypt run, который используется по умолчанию.

Расширение Выпускает сертификат Устанавливает сертификат Заметки
apache Да Да Автоматически выписывает и устанавливает сертификат для веб-сервера Apache 2.4 для Debian-подобных дистрибутивов с использованием библиотеки libaugeas0 версии1.0+.
standalone Да Нет Использует «автономный» (standalone) веб-сервер для получения сертификата. Это полезно для систем без веб-сервера или когда прямая интеграция с веб-сервером не поддерживается или не желательна
webroot Да Нет Получение сертификата путём записи в webroot каталог уже запущенного веб-сервера
manual Да Нет Помогает получить сертификат, давая инструкции для подтверждения доменного имени самостоятельно
nginx Да Да Очень экспериментальный и не включен в letsencrypt-auto.

В будущем планируются расширения для IMAP, SMTP, IRC и других сервисов, которые будут уметь устанавливать, но не выписывать сертификаты.

Apache
Если вы используете Apache 2.4 на Debian-подобных ОС, с использованием библиотеки libaugeas0 версии 1.0+, вы можете использовать Apache расширение. Оно автоматически получит и установит сертификат в веб-сервер Apache. Чтобы использовать это расширение в командной строке, просто добавьте --apache.

Webroot
Если у вас работает локальный веб-сервер, для которого у вас есть возможность изменять содержимое контента и вы не хотите, чтобы веб-сервер останавливал свою работу во время процесса выдачи сертификата, вы можете использовать webroot расширение используя аргументы certonly и --webroot в командной строке. В дополнение вам необходимо указать"--webroot-path или -w корневую директорию (web-root), содержащую файлы обслуживаемого вами веб-сервера. Например, --webroot-path /var/www/html или --webroot-path /usr/share/nginx/html.
Если вы получаете сертификаты для нескольких доменных имён сразу, расширение должно понимать, где каждый домен хранит свои файлы, которые потенциально могут представлять собой отдельный каталог для каждого домена. Когда используется запрос сертифbкатов для множества доменов, каждый домен должен использовать указание своей директории. Например,

letsencrypt certonly --webroot -w /var/www/example/ -d www.example.com -d example.com -w /var/www/other -d other.example.net -d another.other.example.net

т е. получение сертификата для первых двух доменов с указанием директории /var/www/example/ и /var/www/other для последнего.
Расширение webroot создаёт временный файл для каждого запрошенного домена в ${webroot-path}/.well-known/acme-challenge. После Let’s Encrypt проверяет сервер создавая HTTP запрос для подтверждения что DNS для каждого домена возвращает запись соответствующую запущенному letsencrypt. Для примера запрос, отправленный на ваш сервер, выглядит так:

66.133.109.36 - - [05/Jan/2016:20:11:24 -0500] "GET /.well-known/acme-challenge/HGr8U1IeTW4kY_Z6UIyaakzOkyQgPr_7ArlLgtZE8SX HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"

Обратите внимание, что для использования расширения webroot, ваш сервер должен быть сконфигурирован на обслуживание файлов в скрытой директории. Если /.well-known обрабатывается специальных образом на веб-сервере, вам, возможно, потребуется изменить конфигурацию, чтобы быть уверенным, что файлы из /.well-known/acme-challenge обслуживаются веб-сервером.

Standalone
Для получения сертификата автономного веб-сервера, вы можете использовать расширение standalone добавив в запрос командной строги аргументы certonly и --standalone. Расширению необходимы свободные 80 и 443 порты для выполнения проверки подтверждения доменного имени, поэтому вам, возможно, будет необходимо остановить ваш существующий веб-сервер. Для контроля, какой порт использует расширение, добавьте один из следующих аргументов в командную строку:

  • --standalone-supported-challenges http-01 чтобы использовать порт 80
  • --standalone-supported-challenges tls-sni-01 чтобы использовать порт 443

Расширение standalone не зависит от любого другого программного обеспечения, запущенного на сервере, где вы хотите получить сертификат. Но обязательна должна быть возможность принять входящее соединение из Интернета по указанному порту для каждого запрашиваемого доменного имени.

Manual
Если вы хотите получить сертификат не на том сервере, где расположен веб-сервер или может быть выполнено подтверждение доменного имени, вы можете использовать manual расширение. Чтобы использовать расширение добавьте аргумент certonly и --manual в командной строке. Для этого необходимо скопировать и вставить команды другой терминальной сессии, которая может быть на другом компьютере.

Nginx
В будущем, если вы запустит веб-сервер nginx, вы можете использовать nginx расширение для автоматического получения и установки сертификата. Nginx расширение всё ещё экспериментально и не устанавливается вместе с letsencrypt-auto. Если расширение установлено, вы можете выбрать это расширение добавив в командную строку --nginx.

Расширения сторонних разработчиков
Эти расширения представлены на странице https://github.com/letsencrypt/letsencrypt/wiki/Plugins. Если вы заинтересованы, вы можете написать своё расширение.

Перевыпуск сертификата

letsencrypt теперь поддерживает команду renew для проверки всех установленных сертификатов, на приближение окончания срока действия и попытки возобновить их. Самая простая команда проста:

letsencrypt renew

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

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

Команда --force-renew может быть полезна для автоматического перевыпуска; она вызывает игнорирование истечение срока действия сертификата, при рассмотрении вопроса о продлении, и пытается перевыпустить каждый установленный сертификат независимо от его срока. (Этот способ не подходит для ежедневного запуска, потому что каждый сертификат будет обновляться каждый день и быстро столкнется с ограничением скорости центра сертификации)/

Обратите внимание, что параметр letsencrypt renew обновит каждый сертификат, для которого необходим перевыпуск; например, letsencrypt renew --rsa-key-size 4096 попытается заменить каждый сертификат с подходящим к окончанию сроком действия на эквивалентный сертификат с использованием 4096-битного открытого ключа RSA. Если сертификат успешно перевыпущен, с использованием специальных параметров, эти параметры будут сохранены и использованы в будущем для перевыпуска этого сертификата.
Альтернативный способ, который обеспечивает многоуровневый контроль над процессом перевыпуска (при обновлении указанных сертификатов по одному за раз) это letsencrypt certonly с полным набором доменных имен, с учетом конкретного сертификата, указанных с использованием флага -d, как например,

letsencrypt certonly -d example.com -d www.example.com

(Все доменные имена, охватываемые сертификатом, должны быть указаны в этом случае для перевыпуска и замены старого сертификата, а не получения нового; не забывайте про различные www. доменные имена! Указание подмножества доменов создает новый, отдельный сертификат, содержащий только эти доменные имена, а не заменяет оригинал сертификата.) Способ с указанием аргумента certonly подходит только для перевыпуска одного конкретного сертификата.

Пожалуйста, обратите внимание, что УЦ отправляет уведомительное электронное письмо по указанному вами адресу, если вы не продлили сертификаты, которые истекают в ближайшее время.
Let's Encrypt упорно работает над улучшение процесса перевыпуска и приносит извинения за любые неудобства, с которыми вы столкнётесь при использовании этих команд в вашем индивидуальном окружении.

Где мои сертификаты?

Прежде всего, мы рекомендуем использование apache или nginx установщиков (installers), каждый из которых осуществляет управление сертификатами автоматически. Однако, если вы предпочитаете управлять всем вручную, в этом разделе содержится информация о том, где найти необходимые файлы.
Все сгенерированные ключи и выданные сертификаты вы можете найти в директории /etc/letsencrypt/live/$domain. Вместо копирования, пожалуйста, направьте ваш веб-сервер на использование именно этих файлов (или создайте ссылки). В процессе перевыпуска директория /etc/letsencrypt/live обновляется на последние необходимые файлы.

Директории /etc/letsencrypt/archive и /etc/letsencrypt/keys содержат все предыдущие ключи и сертификаты, в то время как /etc/letsencrypt/live ведёт к ссылкам на последние версии.

Доступны следующие файлы:

  • privkey.pem – секретный ключ сертификата.
    Внимание! Этот ключ должен сохраняться в секрете всё время. Никогда не делитесь им ни с кем, включая разработчиков Let’s Encrypt. Вы не можете положить его в сейф, тем не менее – ваш сервер должен иметь доступ к этому файлу для того, чтобы SSL/TLS работал.
    Это то, что нужно веб-серверу apache в директиве SSLCertificateKeyFile и веб-серверу nginx в директиве ssl_certificate_key.
  • cert.pem – только сертификат сервера.
    Это то, что нужно веб-серверу apache версии <2.4.8 в директиве SSLCertificateFile.
  • chain.pem – все сертификаты, которые необходимо предоставить браузеру, кроме сертификата сервера, т.е. только корневой (root) и промежуточные (intermediate) сертификаты.
    Это то, что нужно веб-серверу apache версии <2.4.8 в директиве SSLCertificateChainFile и веб-серверу nginx версии >= 1.3.7 в директиве ssl_trusted_certificate.
  • fullchain.pem – все сертификаты, включая сертификат сервера. Это объединение chain.pem и cert.pem.
    Это то, что нужно веб-серверу apache версии <2.4.8 в директиве SSLCertificateFile и веб-серверу nginx в директиве ssl_certificate.

Важно!На самом деле в файле chain.pem и fullchain.pem отсутствует корневой сертификат УЦ, видимо, с расчётом, что он уже есть в браузерах. Если вы попробуете выполнить проверку с помощью openssl, то увидите следующее:

openssl verify -verbose -CAfile chain.pem cert.pem 
cert.pem: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X1
error 2 at 1 depth lookup:unable to get issuer certificate

Если вы наткнулись на эту проблему, прошу в спойлер:

Spoiler: Highlight to view

Необходимо скачать корневой сертификат и добавить его в цепочку, тогда всё станет хорошо:

wget http://pastebin.com/raw.php?i=z7SP4pb9 -O ca.crt
printf "\n" >> ca.crt
cat chain.pem >> ca.crt
openssl verify -verbose -CAfile ca.crt cert.pem
    /etc/letsencrypt/live/domain.ru/cert.pem: OK


В обеих цепочка файлов, все сертификаты расположены «от корня (корневого сертификата) к листьям».
Пожалуйста, обратите внимание, что вы должны использовать либо chain.pem, либо fullchain.pem. В случае работы через браузер использование только cert.pem вызовет ошибки.

Все файлы находятся в PEM-кодировке, как это следует из расширения файлов. Если вам нужен другой формат, например DER или PFX, тогда вы должны конвертировать их, использую openssl, что означает что вы не сможете использовать автоматическое продление.

Конфигурационный файл

Можно указать файл конфигурации с помощью команды:

letsencrypt-auto --config cli.ini 

(или короче -c cli.ini). Пример конфигурационного файла приведен ниже:

# This is an example of the kind of things you can do in a configuration file.
# All flags used by the client can be configured here. Run Let's Encrypt with
# "--help" to learn more about the available options.
 
# Use a 4096 bit RSA key instead of 2048
rsa-key-size = 4096
 
# Uncomment and update to register with the specified e-mail address
# email = foo@example.com
 
# Uncomment and update to generate certificates for the specified
# domains.
# domains = example.com, www.example.com
 
# Uncomment to use a text interface instead of ncurses
# text = True
 
# Uncomment to use the standalone authenticator on port 443
# authenticator = standalone
# standalone-supported-challenges = tls-sni-01
 
# Uncomment to use the webroot authenticator. Replace webroot-path with the
# path to the public_html / webroot folder being served by your web server.
# authenticator = webroot
# webroot-path = /usr/share/nginx/html

По умолчанию файл расположен в:

  • /etc/letsencrypt/cli.ini
  • $XDG_CONFIG_HOME/letsencrypt/cli.ini (или ~/.config/letsencrypt/cli.ini, если $XDG_CONFIG_HOME не определён).

Подробнее о методах установки через docker, в FreeBSD, OpenBSD, Arch Linux, Debian, Fedora, Gentoo и из исходных кодов можно узнать на официальной странице.

Комментарии

Спасибо, статья очень полезная. Изложено развернуто и понятным языком.

спасибо большое за разъяснение механизма работы. Только прочитав Вашу статью более-менее понял какой смысл стоит за аргументами типа certonly, webroot итд.

Добавить комментарий

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
Target Image