Рубрики
Uncategorized

Автоматизация получения подстановочного знака Сертификаты HTTPS HTTPS для вашего домена с террафом

Этот пост состоит в том, чтобы автоматически получить сертификат подстановки для всего домена, и, следовательно, … с меткой DEVOPS, руководством, производительностью, GoogleCloud.

Этот пост о автоматической выборке сертификата подстановки для всего домена, и поэтому избегая необходимости иметь каждую поддомующую привлечь свой собственный сертификат. Этот пост предназначен для тех, кто уже управляет своим облачным развертыванием с террафом.

Эти дни доступ к веб-сайтам, используя 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 перед выдачей сертификата, который вы можете затем собирать и хранить где-то, где вы можете использовать для будущих развертываний.

Это ручной многоступенчатый процесс, вам нужно:

  1. Запустите CERTBOT, чтобы собрать текст вызова
  2. Поставить этот вызов текст в DNS
  3. Подожди некоторое время для размножения DN
  4. Хит введите обратно в вашу задачу подскажитесь и дождитесь, пока летесшипник генерирует сертификат
  5. Поднимите этот сертификат и поместите его где-нибудь для распространения

Делать это вручную каждые три месяца или около того не плохой выбор, но мы можем сделать лучше.

Если вы уже не знакомы с 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»