- Как работает Let’s Encrypt
- Проверка домена
- Выпуск и отзыв сертификатов
- Letsencrypt способы получения сертификата
- Let’s Encrypt и Express. Каждому серверу – по зелёному замку́
- Предварительные сведения
- План работ
- Перенаправление портов
- Обслуживание статических файлов
- Certbot
- Express и HTTPS
- Обновление сертификата
- Выводы
Как работает Let’s Encrypt
Последнее обновление: 18 окт. 2019 г.
Let’s Encrypt и протокол ACME решают проблему автоматической настройки HTTPS на сервере, когда SSL / TLS сертификаты выдаются и обновляются без участия человека. Таким решением стал специальный сервис — агент по управлению сертификатами — работающий на web-сервере.
Для понимания технологии, разберём настройку домена https://example.com/ агентом сертификатов Let’s Encrypt, состоящую из двух этапов.
На первом этапе агент уведомляет Центр Сертификации о правах администратора сервера на доменное имя. На втором этапе, после подтверждения прав на домен, агент может запрашивать, обновлять и отзывать сертификаты.
Проверка домена
Let’s Encrypt идентифицирует web-сервер с запущенным агентом по открытому ключу. Открытый и закрытый ключи генерируются агентом перед первым подключением к Центру сертификации Let’s Encrypt. После подключения агента к Центру Сертификации, создаётся аккаунт администратора сервера. В созданный аккаунт добавляются доменные имена, которыми владеет администратор, аналогично тому, как это происходит в платных Центрах Сертификации.
Есть несколько способов проверить права на домен. Для каждого варианта Центр Сертификации Let’s Encrypt подготавливает серию тестов. Например, перед проверкой прав на домен example.com , ЦС Let’s Encrypt может предложить агенту на выбор:
- Предоставить DNS-запись для поддомена внутри https://example.com , или
- Предоставить HTTP-ресурс с определённым URI внутри http://example.com/
Одновременно с тестированием прав администратора на домен, Let’s Encrypt проверяет права агента на открытый и закрытый ключи. Let’s Encrypt отправляет агенту одноразовый пароль, который агент должен подписать закрытым ключом и отослать обратно.
Агент пытается выполнить серию тестов для проверки прав на домен. Допустим, успешно выполнено задание по созданию HTTP-ресурса — создан файл по определённому пути внутри http://example.com . Кроме того, агентом получен одноразовый пароль, который был подписан закрытым ключом и отправлен обратно в Let’s Encrypt. Как только эти пункты выполнены — агент уведомляет Центр Сертификации о завершении проверки.
Далее, Центр Сертификации проверяет, всё ли было сделано верно: корректную цифровую подпись на одноразовом пароле, возможность скачать созданный файл по URI, а также его содержимое.
Если цифровая подпись верна, и все тесты пройдены — агенту выдаются права на управление сертификатами для домена example.com . Ключевая пара (открытый и закрытый ключи), используемая при проверке прав на домен, называется “авторизованной ключевой парой” для example.com .
Выпуск и отзыв сертификатов
После авторизации ключевой пары, запрос, обновление и отзыв сертификатов становится делом одной минуты—агент просто посылает текстовые сообщения в Центр сертификации
Источник
Letsencrypt способы получения сертификата
Исследовательская группа безопасности интернета (Internet Security Research Group или ISRG) организовала центр сертификации Let’s Encrypt. Цель проекта — снижение финансовых и технологических барьеров для обеспечения безопасной связи через Интернет. Выдача сертификатов реализована по протоколу ACME (Automatic Certificate Management Environment). Для работы с ним потребуется один из рекомендуемых клиентов. В рамках статьи рассмотрен GetSSL.
Содержание
Установка
GetSSL узкоспециализированное приложение, решающее конкретную задачу (выдачу, отзыв и замену сертификатов). В дереве пакетов известных мне операционных систем оно отсутсвует (Gentoo, Ubuntu). Процесс установки заключается в скачивании bash скрипта из github:
GetSSL использует openssl, dnsutils и ssh, их также необходимо установить:
Если установка прошла успешно команда getssl сообщит свою версию:
Настройка
Данные, используемые при работе, сохраняются в файловой системе. По умолчанию, рабочая директория создается в домашнем каталоге пользователя
/.getssl. По-необходимости, с помощью ключа ‘-w working_dir‘, можно указать другую директорию.
Доменная модель GetSSL оперирует двумя видами сущностей:
- Аккаунт — глобальный набор правил распространяемых на сервер;
- Домен — набор правил для конкретного доменного имени.
Добавление нового домена в список производится с помощью ключа -c yourdomain. Например, чтобы добавить domain.ltd:
При первом запуске getssl создаст конфигурационный файл аккаунта и домена.
Остальная настройка будет рассмотрена на примере домена domain.tld.
Настройка аккаунта
Конфигурационный файл аккаунта расположен в корне рабочей директории (По умолчанию:
Let’s Encrypt ограничивает лимит запросов к своим серверам. Для отладочных целей лучше использовать stagging сервер:
CA (Центр Сертификации) необходимо заменить на «https://acme-v01.api.letsencrypt.org» после успешного получения демо сертификата.
Глобально принять соглашение предоставления услуг:
Указать email адрес для связи с вами:
Настройка домена
Конфигурационный файл домена расположен внутри одноименной директории. Например, domain.ltd —
Так как домен domain.tld и www.domain.tld, с точки зрения браузера, различны, каждый необходимо подтвердить. Измените альтернативные имена субьектов на актуальный список доменных имен:
При получении сертификата Let’s Encrypt проверяет права владения доменом(ами). Флаг ACL (ACME Challenge Location) указывает на директорию в которую будет сохранено выполненное задание (challenge):
Директория ‘/var/www/domain.tld/web/.well-known/acme-challenge’ должна быть доступна по адресу http://domain.tld/.well-known/acme-challenge. Директива для nginx:
Установите флаг USE_SINGLE_ACL для использование одной директории при подтверждении прав на домены.
Флаги DOMAIN_CERT_LOCATION, DOMAIN_KEY_LOCATION, CA_CERT_LOCATION используются для копирования цепочки сертификатов и закрытого ключа в директорию к которой веб сервер имеет доступ:
Получение сертификата
Получение демо сертификата производится для каждого домена:
Если GetSSL сообщил о успешном получении сертификата (Verification completed, obtaining certificate.), измените CA в конфигурационном файле аккаунта **
/.getssl/getssl.cfg сервер сертификации:
затем повторите запрос ещё раз:
Флаг -f принудительно запросит новый сертификат (По умолчанию, обновить сертификат возможно только через 30 дней)
GetSSL заного пройдет процедуру получения сертификата и сохранит сертификат в рабочей директории (По умолчанию
/.getssl/domain.tld/), а также скопирует их в доступное для веб сервера место (В данном случае /etc/ssl/).
При переводе веб сервера на протокол https лучше использовать связку сертификатов domain-chain.crt. В nginx сервер использующий SSL:
Итоги
Использовать https в своих ресурсах можно не только для предоставления бОльшей безопасности своим пользователям.
Переход на защищенную версию протокола дает возможность использовать сжатие. Сжатие в общем случае снизит объем трафика и ускорит загрузку страниц у пользователей. Судя по по проведенным исследованиям сжатие может достигать 80 и более процентов.
Кeep alive. Клиент и сервер могут договориться не закрывать установленное tcp-соединение после завершения запроса, а переиспользовать его для следующих запросов. В свою очередь это делает загрузку последующих страниц несколько быстрее.
Продление сертификата Let’s Encrypt. Человеческий фактор — причина возникновения исключительных ситуаций. Частичная автоматизация процесса поможет избежать приключений и сохранить здоровый сон.
Источник
Let’s Encrypt и Express. Каждому серверу – по зелёному замку́
HTTPS становится всё более сильным трендом современного интернета. И это хорошо, особенно, когда клиенты, взаимодействуя с серверами, обмениваются с ними конфиденциальными данными. Для того, чтобы пользоваться HTTPS, нужен SSL-сертификат, который применяется для проверки подлинности сервера. Проект Let’s Encrypt значительно упростил процесс получения SSL-сертификатов. До его появления всё было гораздо сложнее.
Предварительные сведения
Мы собираемся использовать Certbot в режиме webroot, запуская его с ключом —webroot . Если в двух словах, то в этом режиме Certbot разместит файл в некоей директории нашего сервера, которая должна быть доступна по протоколу HTTP.
С помощью Express обслуживать директории, содержащие статические файлы, можно, используя функцию express.static() .
Если взглянуть на раздел документации Certbot, посвящённый режиму webroot, окажется, что Certbot будет искать на сервере файл по адресу http:// /.well-known/acme-challenge/ . Если он может успешно получить по HTTP файл, который был размещён в указанной директории, он создаст для этого сервера SSL-сертификат.
Итак, приступим.
План работ
Для получения сертификата и поддержания его актуальности нам понадобится пройти через пять этапов:
- Перенаправить соответствующие порты.
- Настроить структуру директорий для статических файлов и организовать её обслуживание с помощью Express.
- Установить и запустить Certbot.
- Настроить Express на использование HTTPS.
- Обновить сертификат Let’s Encrypt через 90 дней.
Ниже опишем эти этапы подробнее, с примерами кода и команд.
Перенаправление портов
Уверен, это ни у кого затруднений не вызовет, но, для полноты изложения, опишу этот шаг.
Для успешного прохождения процесса верификации требуется URL сервера. Certbot будет использовать этот URL для того, чтобы связаться с сервером и получить данные по HTTP. Это означает, что порт 80 на предоставленном URL должен быть доступен из интернета. Не помешает открыть и порт 443, так как это порт HTTPS по умолчанию.
Лично я предпочитаю держать мои Express-сервера на портах, номера которых выше, чем 1024, а затем, используя правила перенаправления, передавать трафик с портов 80 или 443 на сервера. Как результат, мне не нужно давать Express повышенные привилегии, что безопаснее, особенно учитывая то, что веб-сервер будет обрабатывать потенциально опасный трафик.
Для того, чтобы проверить сетевые настройки, можно воспользоваться утилитой curl . Например, если на сервере имеется адрес для тестирования работоспособности системы (что всегда полезно), запрос на этот адрес можно выполнить с помощью curl . Предположим, сервер настроен так:
Если обратиться к конечной точке health-check с помощью curl , на то, что всё в порядке, укажет ответ HTTP 200.
Когда сеть и сервер готовы к работе, можно переходить к настройке обслуживания статических файлов.
Обслуживание статических файлов
Как сказано выше, адрес, по которому обратится Certbot для проверки сервера — /.well-known/acme-challenge . Express использует функцию express.static() для обслуживания статических файлов по пути, указанному этой функции. Этот путь становится корнем сервера. Часто папка, которая хранит статические данные веб-сайта, называется public или static , и, например, если у вас есть текстовый файл, видный в файловой системе как /static/test-text/mytextfile.txt , обратиться к нему извне можно по адресу http:// . Учитывая это, создадим структуру директорий для нужд Certbot и подключим её в Express.
Вышеприведённая команда выполняется из корня проекта, при этом подразумевается, что директория для статических данных имеет имя static .
Теперь, после того, как Express настроен на обслуживание правильной папки, проверим работоспособность системы.
Если в консоль будет выведен текст «this is a test», значит данный шаг успешно завершён и можно идти дальше – к созданию нового SSL-сертификата.
Certbot
Первый шаг на данном этапе – установка Certbot. Здесь можно найти инструкции по установке. А именно, чтобы их увидеть, в поле I’m using выберите None of the above, затем, в следующем поле, выберите вашу ОС. После этого будет показана команда для установки. Например, для Ubuntu 16.04 (xenial) эта команда выглядит так: sudo apt-get install letsencrypt .
Следующий шаг заключается в том, чтобы сгенерировать сертификат. Как уже было сказано, мы собираемся запустить Certbot в режиме webroot. Для этого понадобится передать ему путь, который будет использован в качестве корня веб-сервера (используя ключ –w ), и доменное имя (с помощью ключа –d ). В данном случае команда выглядит так:
Здесь мы исходим из предположения, что вы находитесь в директории проекта. После успешного выполнения команды, вы увидите соответствующее сообщение и сведения о расположении сгенерированных файлов. Обычно они находятся по адресу /etc/letsencrypt/live/ . О том, что это за файлы, можно узнать из раздела Webroot в руководстве по Certbot. Мы собираемся использовать с нашим Express-сервером файлы fullchain.pem и privkey.pem .
Отлично! Вот он, наш новенький SSL-сертификат. Теперь задействуем его.
Express и HTTPS
Express, сразу после установки, работает лишь по HTTP. Мы можем настроить использование HTTPS в Express, используя модуль Node https . Для того, чтобы это сделать, понадобится два файла – сертификат и секретный ключ. Кстати сказать, берегите от чужих глаз секретный ключ вашего сервера, а доступ к файлу секретного ключа давайте только авторизованным пользователям.
Кроме того, рекомендуется либо скопировать файлы fullchain.pem и privkey.pem в директорию проекта, либо создать символические ссылки на них. Создание символических ссылок упрощает процесс обновления, но что именно выбрать – дело ваше.
Нижеприведённый код основан на предположении о том, что файлы fullchain.pem и privkey.pem находятся в папке sslcert в директории проекта.
Кроме того, тут не помешает Helmet.js. Этот пакет помогает защищать Express-сервера, управляя HTTP-заголовками. Он, помимо прочего, добавляет HSTS, убирает заголовок X-Powered-By и устанавливает заголовок X-Frame-Options для защиты от кликджекинга.
Установить его очень просто:
После установки Helmet, его можно задействовать в Express как промежуточный слой обработки данных.
Теперь, чтобы окончательно убедиться в том, что всё работает, можно проверить сервер с помощью чего-то вроде SSL Server Test.
Обновление сертификата
Сертификаты Let’s Encrypt действуют 90 дней. Хорошо это или плохо – спорить бессмысленно, особенно учитывая то, что процесс обновления сертификата очень прост. А именно, для обновления сертификата достаточно выполнить команду letsencrypt renew и Certbot выпустит новый сертификат. Рекомендуется автоматизировать этот процесс, используя либо задания cron , либо что-то вроде systemd .
Выводы
В итоге, мы настроили сервер Express на обслуживание статических файлов по специфическому пути, использовали Certbot в режиме webroot для создания сертификата сервера и подключили HTTPS в Express, используя только что созданный сертификат. Хотя автоматический процесс взаимодействия с Certbot нам и не доступен, сделать вручную всё, что надо, не так уж и сложно.
Хочется надеяться, что Certbot, в обозримом будущем, оснастят поддержкой Node.js.
А как вы получаете SSL-сертификаты для Express-серверов? Пользуетесь ли сертификатами от Let’s Encrypt?
Источник