letsencryptsh
дехидратированный
Установите и настройте dehydrated
. Создайте пользователя для снижения привилегий и конфигурации cron для обновления сертификатов.
dehydrated
работает с вашими закрытыми ключами, поэтому будьте осторожны и просмотрите код этой ansible-ролей и используемого скрипта dehydrated.
Для примера настройки с nginx в качестве https-прокси, посмотрите ansible-роль martin-v/ansible-nginx_https_only.
Требования
Роль устанавливает на хосте:
- openssl
- curl
- sed
- grep
- mktemp
- git
Эта роль требует веб-сервер, который обслуживает каталог, указанный в dehydrated_challengesdir
(по умолчанию: /var/www/dehydrated/
) по адресу http://<ваш-домен>/.well-known/acme-challenge/
для всех запрашиваемых доменов сертификатов.
Переменные роли
Обязательные переменные:
dehydrated_contactemail
Адрес для аккаунта letsencrypt. В основном для уведомлений о истечении сертификата, но это не должно происходить, если cron-задача работает хорошо.
dehydrated_contactemail: [email protected]
dehydrated_letsencrypt_agreed_terms
Чтобы принять условия использования letsencrypt, установите переменную dehydrated_letsencrypt_agreed_terms
на текущий URL лицензии. Актуальный URL можно найти по адресу https://acme-v01.api.letsencrypt.org/terms.
dehydrated_letsencrypt_agreed_terms: https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf
dehydrated_domains
Список доменов для запросов на сертификаты. Для каждой строки будет создан сертификат в папке /etc/dehydrated/certs/
с именем первого домена в строке. Первый домен является общим именем, остальные в строке будут альтернативными именами для сертификата.
dehydrated_domains: |
example.com
example.org www.example.org blog.example.org
dehydrated_deploy_cert
Сертификаты должны быть читаемы для таких сервисов, как apache или dovecot. Но только конкретным сервисам следует разрешить читать сертификат для этой службы. Поэтому мы должны изменить владельца/группу на конкретное значение для каждого сертификата. По соображениям безопасности это может быть сделано только пользователем root.
Для универсального решения существует переменная dehydrated_deploy_cert
. Эта переменная должна содержать bash-скрипт для развертывания сертификатов. Типичные задачи при развертывании - это копирование сертификата в другие директории, изменение владельца/разрешений файла и перезапуск сервисов.
Этот код вызывается аналогично обычным хукам dehydrated, но после завершения полного процесса dehydrated и с правами root. Код вызывается один раз для каждого сертификата, который был создан.
Параметры:
DOMAIN
Первичное доменное имя, т.е. общее имя сертификата (CN).KEYFILE
(Имя файла: privkey.pem) Путь к файлу, содержащему закрытый ключ.CERTFILE
(Имя файла: cert.pem) Путь к файлу, содержащему подписанный сертификат.FULLCHAINFILE
(Имя файла: fullchain.pem) Путь к файлу, содержащему полную цепочку сертификатов.CHAINFILE
(Имя файла: chain.pem) Путь к файлу, содержащему промежуточные сертификаты.TIMESTAMP
(Имя файла: chain.pem) Метка времени, когда был создан указанный сертификат.
Пример:
dehydrated_deploy_cert: |
mkdir -p /etc/nginx/ssl/${DOMAIN}
cp "${KEYFILE}" "${CERTFILE}" "${FULLCHAINFILE}" "${CHAINFILE}" /etc/nginx/ssl/${DOMAIN}
chown root:root /etc/nginx/ssl/${DOMAIN}/*
chmod 600 /etc/nginx/ssl/${DOMAIN}/*
systemctl restart nginx.service
dehydrated_run_cron_on_every_ansible_run
Эта роль запускает скрипт cron при каждом выполнении для создания или обновления сертификатов. Чтобы отключить это поведение, используйте:
dehydrated_run_cron_on_every_ansible_run: false
Опциональные переменные:
dehydrated_challengesdir
Каталог для файлов acme-challenge. Ваш веб-сервер должен сделать этот каталог общедоступным по адресу http://<ваш-домен>/.well-known/acme-challenge/
для всех перечисленных доменов. Этот каталог будет создан, если он не существует. Он должен быть только доступен для записи пользователя dehydrated и читаемым для вашего веб-сервера, что будет обеспечено этой ролью.
dehydrated_challengesdir: /var/www/dehydrated/
Другие переменные
Также есть несколько необычных переменных для суперпользователя, которому нужно больше контроля. Для подробностей смотрите файл defaults/main.yml
.
Зависимости
Нет.
Пример плейбука
- hosts: all
remote_user: root
vars_files:
- dehydrated_vars.yml
roles:
- martin-v.dehydrated
Пример файла переменных
dehydrated_contactemail: [email protected]
dehydrated_letsencrypt_agreed_terms: https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf
dehydrated_domains: |
example.com
example.org www.example.org blog.example.org
dehydrated_deploy_cert: |
mkdir -p /etc/nginx/ssl/${DOMAIN}
cp "${KEYFILE}" "${CERTFILE}" "${FULLCHAINFILE}" "${CHAINFILE}" /etc/nginx/ssl/${DOMAIN}
chown root:root /etc/nginx/ssl/${DOMAIN}/*
chmod 600 /etc/nginx/ssl/${DOMAIN}/*
systemctl restart nginx.service
Советы
Чтобы создать сертификаты при развертывании ansible, вы можете вызвать обычный скрипт cron: shell: "/etc/cron.weekly/dehydrated"
. Папка tests
содержит полный рабочий пример.
Для импорта из официального клиента letsencrypt посмотрите страницу импорта dehydrated в вики.
Открытые задачи
- Использовать molecule для более качественных тестов.
Лицензия
MIT
Информация об авторе
Эта роль была создана в 2016 году и улучшена в 2017 году Мартином В..
Install and configure [`dehydrated`](https://github.com/lukas2511/dehydrated). Create user for privilege dropping and cron configuration for certificate renewals.
ansible-galaxy install martin-v/ansible-dehydrated