influunt media

influunt media

Who am I?

Блог разработчика: обзор инструментов, практические примеры, мысли и исследования


Получение сертификата Let's Encrypt


Исследовательская группа безопасности интернета (Internet Security Research Group или ISRG) организовала центр сертификации Let's Encrypt. Цель проекта - снижение финансовых и технологических барьеров для обеспечения безопасной связи через Интернет. Выдача сертификатов реализована по протоколу ACME (Automatic Certificate Management Environment). Для работы с ним потребуется один из рекомендуемых клиентов. В рамках статьи рассмотрен GetSSL.

Содержание
  1. Установка
  2. Настройка
  3. Получение сертификата
  4. Итоги
Установка

GetSSL узкоспециализированное приложение, решающее конкретную задачу (выдачу, отзыв и замену сертификатов). В дереве пакетов известных мне операционных систем оно отсутсвует (Gentoo, Ubuntu). Процесс установки заключается в скачивании bash скрипта из github:

srv ~ # curl --silent https://raw.githubusercontent.com/srvrco/getssl/master/getssl > getssl
#Разрешить чтение всем пользователям и запретить изменение:
srv ~ # chmod 700 getssl 
#Поместить скрипт в /bin, чтобы не указывать полный путь при запуске:
srv ~ # mv getssl /bin/

GetSSL использует openssl, dnsutils и ssh, их также необходимо установить:

srv ~ # apt-get install -y openssl dnsutils openssh-client

Если установка прошла успешно команда getssl сообщит свою версию:

srv ~ # getssl
getssl ver. 1.37
Obtain SSL certificates from the letsencrypt.org ACME server

Usage: getssl [-h|--help] [-d|--debug] [-c|--create] [-f|--force] [-a|--all] [-q|--quiet] [-u|--upgrade] [-w working_dir] domain

Options:
  -h, --help      Display this help message and exit
  -d, --debug     Outputs debug information
  -c, --create    Create default config files
  -f, --force     Force renewal of cert (overrides expiry checks)
  -a, --all       Check all certificates
  -q, --quiet     Quiet mode (only outputs on error, or succcess of new cert)
  -u, --upgrade   Upgrade getssl if a more recent version is available
  -w working_dir  Working directory
Настройка

Данные, используемые при работе, сохраняются в файловой системе. По умолчанию, рабочая директория создается в домашнем каталоге пользователя ~/.getssl. По-необходимости, с помощью ключа '-w working_dir', можно указать другую директорию.

Доменная модель GetSSL оперирует двумя видами сущностей:

  • Аккаунт - глобальный набор правил распространяемых на сервер;
  • Домен - набор правил для конкретного доменного имени.

Добавление нового домена в список производится с помощью ключа -c yourdomain. Например, чтобы добавить domain.ltd:

srv ~ # getssl -c domain.tld
creating main config file /root/.getssl/getssl.cfg
Making domain directory - /root/.getssl/domain.tld
creating domain config file in /root/.getssl/domain.tld/getssl.cfg

При первом запуске getssl создаст конфигурационный файл аккаунта и домена.

Остальная настройка будет рассмотрена на примере домена domain.tld.

Настройка аккаунта

Конфигурационный файл аккаунта расположен в корне рабочей директории (По умолчанию: ~/.getssl/getssl.cfg)

Let's Encrypt ограничивает лимит запросов к своим серверам. Для отладочных целей лучше использовать stagging сервер:

CA="https://acme-staging.api.letsencrypt.org" # Сервер для отладки
#CA="https://acme-v01.api.letsencrypt.org" # Сервер центра сертификации

CA (Центр Сертификации) необходимо заменить на "https://acme-v01.api.letsencrypt.org" после успешного получения демо сертификата.

Глобально принять соглашение предоставления услуг:

AGREEMENT="https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf"

Указать email адрес для связи с вами:

ACCOUNT_EMAIL="admin@domain.tld"

Настройка домена

Конфигурационный файл домена расположен внутри одноименной директории. Например, domain.ltd - ~/.getssl/domain.ltd/getssl.cfg

Так как домен domain.tld и www.domain.tld, с точки зрения браузера, различны, каждый необходимо подтвердить. Измените альтернативные имена субьектов на актуальный список доменных имен:

SANS="domain.tld,www.domain.tld"

При получении сертификата Let's Encrypt проверяет права владения доменом(ами). Флаг ACL (ACME Challenge Location) указывает на директорию в которую будет сохранено выполненное задание (challenge):

ACL=('/var/www/domain.tld/web/.well-known/acme-challenge')

Директория '/var/www/domain.tld/web/.well-known/acme-challenge' должна быть доступна по адресу http://domain.tld/.well-known/acme-challenge. Директива для nginx:

location ~ /.well-known {
    allow all;
    root /var/www/domain.tld/web;
}

Установите флаг USE_SINGLE_ACL для использование одной директории при подтверждении прав на домены.

USE_SINGLE_ACL="true"

Флаги DOMAIN_CERT_LOCATION, DOMAIN_KEY_LOCATION, CA_CERT_LOCATION используются для копирования цепочки сертификатов и закрытого ключа в директорию к которой веб сервер имеет доступ:

DOMAIN_CERT_LOCATION="/etc/ssl/domain.tld.crt"
DOMAIN_KEY_LOCATION="/etc/ssl/domain.tld.key"
CA_CERT_LOCATION="/etc/ssl/chain.crt"
Получение сертификата

Получение демо сертификата производится для каждого домена:

srv ~ # getssl domain.tld
Registering account
Verify each domain
Verifing domain.tld
copying challenge token to /var/www/domain.tld/web/.well-known/acme-challenge/ICeEYD-dhUrDxTfm0DqGoiaifej_UvogBsoacW67Ckg
Verified domain.tld
Verifing www.domain.tld
copying challenge token to /var/www/domain.tld/web/.well-known/acme-challenge/gZVmGkR-zDpdQ63XgOhWaKx3WetiqtrYXLifNRTv1_A
Verified www.domain.tld
Verification completed, obtaining certificate.
Certificate saved in /root/.getssl/domain.tld/domain.tld.crt
The intermediate CA cert is in /root/.getssl/domain.tld/chain.crt
copying domain certificate to /etc/ssl/domain.tld.crt
copying private key to /etc/ssl/domain.tld.key
copying CA certificate to /etc/ssl/chain.crt
copying full chain to /etc/ssl/domain-chain.crt
reloading SSL services

Если GetSSL сообщил о успешном получении сертификата (Verification completed, obtaining certificate.), измените CA в конфигурационном файле аккаунта **~/.getssl/getssl.cfg сервер сертификации:

#CA="https://acme-staging.api.letsencrypt.org" # Сервер для отладки
CA="https://acme-v01.api.letsencrypt.org" # Сервер центра сертификации

затем повторите запрос ещё раз:

srv ~ # getssl -f domain.tld

Флаг -f принудительно запросит новый сертификат (По умолчанию, обновить сертификат возможно только через 30 дней)

GetSSL заного пройдет процедуру получения сертификата и сохранит сертификат в рабочей директории (По умолчанию ~/.getssl/domain.tld/), а также скопирует их в доступное для веб сервера место (В данном случае /etc/ssl/).

При переводе веб сервера на протокол https лучше использовать связку сертификатов domain-chain.crt. В nginx сервер использующий SSL:

server {
    listen 443 ssl;

    server_name domain.tld;
    server_name www.domain.tld;

    ssl_certificate /etc/ssl/domain-chain.crt;
    ssl_certificate_key /etc/ssl/domain.tld.key;

    ...
}
Итоги

Использовать https в своих ресурсах можно не только для предоставления бОльшей безопасности своим пользователям.

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

Кeep alive. Клиент и сервер могут договориться не закрывать установленное tcp-соединение после завершения запроса, а переиспользовать его для следующих запросов. В свою очередь это делает загрузку последующих страниц несколько быстрее.

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