Этот пост о автоматической выборке сертификата подстановки для всего домена, и поэтому избегая необходимости иметь каждую поддомующую привлечь свой собственный сертификат. Этот пост предназначен для тех, кто уже управляет своим облачным развертыванием с террафом.
Эти дни доступ к веб-сайтам, используя HTTPS, является нормой. Браузеры, как правило, предупреждают вас, когда вы используете HTTP-сайт, и в некоторых случаях отказываются подключаться к HTTP-ресурсам с сайтов, которые подаются с HTTPS.
К счастью, процесс получения сертификата HTTPS с использованием Letsencrypt является довольно тривиальным, особенно если вы используете Docker. До моего настройки запроса подстановки (тема этого поста) у меня все виртуальные машины делают это при запуске:
docker run -d -v /etc/letsencrypt:/etc/letsencrypt -p 80:80 certbot/certbot certonly --standalone --preferred-challenges http -d site.example.com -m letsencrypt@example.com --agree-tos --no-eff-email
Это в основном без присмотра сертификата. То, что он будет делать, — это запустить временный веб-сервер в порту 80 на машине, запустите METBOT в режиме «CETTONLY» (I.E. не пытается обнаружить существующий веб-сервер, чтобы попытаться настроить), и отвечать на вызовы HTTP, необходимые для CERTBOT. Это предполагает, что эта конкретная машина уже была настроена как site.example.com
На DNS (что это что-то в моих установках, подойдет террафом). Как работает эта команда, именно за пределами объема этого поста, но проверьте Документация Docker Image Certbot Docker и Certbot Документация Больше подробностей.
Этот метод был относительно простым и вполне надежен для управления сертификатами NetSensrypt для небольшого количества виртуальных виртуальных машин, я даже заканчивал запись скрипта оболочки, который будет принимать домен запроса в качестве аргумента, выполните вышеупомянутое, а затем сидеть в петле Sleep пытаясь возобновить сертификацию каждые несколько дней; и построил это в Google VM, используя Пакет Так что каждая машина загружалась с установленной CERTBOT и готовой для получения требуемого сертификата поддомена. Но по мере роста развертывания, и, поскольку я начал, нуждающихся в более внутренних единственных сертиях, которые не были доступны внешне, мне нужно лучшее решение.
Получение сертификата для site.example.com
Домен означает, что сертификат действителен для этого одного поддомена. Сертификат подстановки с другой стороны, как * .example.com.
будет соответствовать каждому поддомену example.com
Отказ Это означает, что вам нужно только один сертификат, выданный для всего вашего домена.
Небольшой поймать это то, что вы не можете выдать HTTP-задачу для * .example.com.
Для того, чтобы вы доказать, чтобы освободить, что у вас есть домен. Вместо этого вам нужно сделать вызов DNS. Это где при подключении к серверам Letsencrypt они говорят вам придерживаться специального значения в ваших записях DNS, чтобы вы могли доказать, что вы владеете всеми DNS.
Делать это вручную не так уж плохо, вы также можете запустить его в Docker (но на этот раз как интерактивная программа)
docker run --rm -it -v /etc/letsencrypt:/etc/letsencrypt certbot/certbot certonly --manual --preferred-challenges dns -d *.example.com -m letsencrypt@example.com --agree-tos --no-eff-email
Это создаст следующий запрос:
Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator manual, Installer None Obtaining a new certificate Performing the following challenges: dns-01 challenge for example.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NOTE: The IP of this machine will be publicly logged as having requested this certificate. If you're running certbot in manual mode on a machine that is not your server, please ensure you're okay with that. Are you OK with your IP being logged? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: y - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please deploy a DNS TXT record under the name _acme-challenge.example.com with the following value: F2np-hIEy7ajPLK6OaWztedukdTQCNGJgzB-PfOaT24 Before continuing, verify the record is deployed. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Press Enter to Continue
На данный момент вам нужно пойти создать запись TXT о F2np-hiey7ajplk6oawztedukdtqcngjgzb-pfoat24
В DNS вашего домена, а затем подождите некоторое время для этого DNS, чтобы пророчить немного (обычно не слишком много времени, так как летесшип был достаточно умным, чтобы опросить авторитетный DNS вашего домена, а не общедоступным DNS, который потребуется больше времени для распространения to), а затем нажмите Enter, чтобы позволить Letsensrypt проверить DNS перед выдачей сертификата, который вы можете затем собирать и хранить где-то, где вы можете использовать для будущих развертываний.
Это ручной многоступенчатый процесс, вам нужно:
- Запустите CERTBOT, чтобы собрать текст вызова
- Поставить этот вызов текст в DNS
- Подожди некоторое время для размножения DN
- Хит введите обратно в вашу задачу подскажитесь и дождитесь, пока летесшипник генерирует сертификат
- Поднимите этот сертификат и поместите его где-нибудь для распространения
Делать это вручную каждые три месяца или около того не плохой выбор, но мы можем сделать лучше.
Если вы уже не знакомы с Terraform, это IAC — инфраструктура в качестве кода, позволяя вам настроить и настроить свои публичные облачные ресурсы с использованием декларативного Langauge, а не вручную, используя веб-интерфейс или CLI. Его сильные стороны заключаются в том, что после вы записи ваших декларативных облачных конфигуров (которые проверяются в управлении версиями для удобной версии и совместной работы), он связывается с облачным провайдером и работает, какие изменения необходимы, и только применяет эти изменения. Вам не нужно беспокоиться о случайном создании дублированных ресурсов.
К счастью для нас, террафом уже есть модуль, который на основе DNS на основе выпусков выплаты. Файл Terraform может быть довольно простым, и выглядит так (при условии, что мы используем GCP, но есть поддержка AWS Route53 и другие)
provider "acme" { # staging # server_url = "https://acme-staging-v02.api.letsencrypt.org/directory" # production server_url = "https://acme-v02.api.letsencrypt.org/directory" } resource "tls_private_key" "reg_private_key" { algorithm = "RSA" } resource "acme_registration" "reg" { account_key_pem = tls_private_key.reg_private_key.private_key_pem email_address = "letsencrypt@example.com" } resource "tls_private_key" "cert_private_key" { algorithm = "RSA" } resource "tls_cert_request" "req" { key_algorithm = "RSA" private_key_pem = tls_private_key.cert_private_key.private_key_pem subject { common_name = "*.example.com" organization = "Example Organization" } } resource "acme_certificate" "certificate" { account_key_pem = acme_registration.reg.account_key_pem certificate_request_pem = tls_cert_request.req.cert_request_pem dns_challenge { provider = "gcloud" config = { GCE_SERVICE_ACCOUNT_FILE = "path/to/credentials.json" GCE_POLLING_INTERVAL = 240 GCE_PROPAGATION_TIMEOUT = 600 } } }
Единственное, что было GOTCHA вот как поставщик DNS_CHALLENG работает в ресурсе ACME_CERTITATE. Поставщик «ACME» поддерживает свой собственный клиент, чтобы сделать обновления DNS, которые отдельно от любых других поставщиков Terraform, которые вы можете использовать. Этот поставщик, по-видимому, умеет автоматически найти ваши записи DNS и добавить их TXT, хотя у него есть некоторые переменные, чтобы помочь ему сказать, где их искать.
В приведенном выше примере я решил указывать GCE_Service_account_file, который у меня уже имел (это то же самое, что использует поставщик Google Terraform Google, поэтому он уже где-то был на диске). Но вы также можете получить Terraform Generate учетную запись услуг и ключ с помощью привилегий DNS, если хотите.
Второй выпуск заключался в том, что я нахожу его проверять DNS слишком быстро, до того, как записи размножаются до момента, где можно прочитать летесшипник, поэтому я застрял в пользовательском интервале опроса и тайм-аута, который исправил его.
Как только это применяется, файлы CIT доступны в качестве атрибутов acme_certificate.Цертификация
Отказ Пример использования их копирования в VM:
resource "google_compute_instance" "a_vm" { ... provisioner "file" { content = tls_private_key.cert_private_key.private_key_pem destination = "/etc/ssl/privkey.pem" connection { type = "ssh" ... } } provisioner "file" { content = "${acme_certificate.certificate.certificate_pem}${acme_certificate.certificate.issuer_pem}" destination = "/etc/ssl/fullchain.pem" connection { type = "ssh" ... } } }
Это вытягивает в закрытый ключ, используемый для запроса сертификата, и объединяет сертификат/эмитент, используемый для формирования FullChain.PEM.
К сожалению, при использовании этого метода есть небольшая сложность при использовании этого метода, когда речь идет о решении с обновлениями сертификатов, поскольку Terraform не включает автоматическое изменение содержимого файлов файлов ресурсов VM-ресурсов VM, означает, что при использовании этого метода мне пришлось бы вручную, чтобы террафом мог воссоздайте его с новым сертификатом. К счастью, существуют и другие способы справиться с этим без вручную, начиная от использования балансировщика нагрузки или прокси, чтобы придерживаться сертификата во что-то другое для управления.
В любом случае, проблема хранения серверов WildCard Certuals по всему ресурсам не отличается при использовании террафора и при выполнении его вручную, и, поскольку теперь это упростило задачу получения сертификата подстановки для домена, а также сделать сертификат, готовый к нему. Застрял на то, что вы используете для управления сертиями, от 5 или 6 ручных шагов, до одного Террафом применяется
Я называю это победа.
Обложка Фото Mackenzie Marco. на Бессмысленно
Оригинал: «https://dev.to/meseta/automating-fetching-of-wildcard-letsencrypt-https-certificates-for-your-domain-li6»