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