Включение автоматического HTTPS с помощью Caddy в контейнере бокового автомобиля
В этой статье описывается, как Caddy можно использовать в качестве контейнера на стороне в группе контейнеров и выступать в качестве обратного прокси-сервера, чтобы предоставить автоматически управляемую конечную точку HTTPS для приложения.
Caddy — это мощный, корпоративный, открытый код веб-сервер с автоматическим протоколом HTTPS, написанным на Go, и представляет альтернативу Nginx.
Автоматизация сертификатов возможна, так как Caddy поддерживает API ACMEv2 (RFC 8555), который взаимодействует с Let's Encrypt для выдачи сертификатов.
В этом примере только контейнер Caddy предоставляется через порты 80/TCP и 443/TCP. Приложение за обратным прокси-сервером остается закрытым. Сетевое взаимодействие между Caddy и приложением происходит через localhost.
Примечание.
Это отличается от связи внутри группы контейнеров, известной из docker compose, где контейнеры можно ссылаться по имени.
В примере подключается Caddyfile, который требуется для настройки обратного прокси-сервера из общей папки, размещенной в учетной записи служба хранилища Azure.
Примечание.
Для рабочих развертываний большинство пользователей хотят создать Caddyfile в пользовательском образе Docker на основе caddy. Таким образом, не нужно подключать файлы к контейнеру.
Необходимые компоненты
Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см . в кратком руководстве по Bash в Azure Cloud Shell.
Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.
Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.
Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.
Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.
- Для работы с этой статьей требуется Azure CLI версии 2.0.55 или более поздней. Если вы используете Azure Cloud Shell, последняя версия уже установлена.
Подготовка Caddyfile
Создайте файл с именем Caddyfile
и вставьте следующую конфигурацию. Эта конфигурация создает конфигурацию обратного прокси-сервера, указывающую на контейнер приложения, прослушивающий 5000/TCP.
my-app.westeurope.azurecontainer.io {
reverse_proxy http://localhost:5000
}
Важно отметить, что конфигурация ссылается на доменное имя вместо IP-адреса. Caddy должен быть доступен по этому URL-адресу, чтобы выполнить вызов, необходимый протоколу ACME, и успешно получить сертификат из Let's Encrypt.
Примечание.
Для рабочего развертывания пользователи могут использовать доменное имя, которое они управляют, api.company.com
например, и создать запись CNAME, указывающую на например. my-app.westeurope.azurecontainer.io
Если это так, необходимо убедиться, что имя личного домена также используется в Caddyfile, а не в том, которое назначено Azure (например, *.westeurope.azurecontainer.io
). Кроме того, имя личного домена должно ссылаться в конфигурации YAML ACI, описанной далее в этом примере.
Подготовка учетной записи хранения
Создание учетной записи хранилища
az storage account create \
--name <storage-account> \
--resource-group <resource-group> \
--location westeurope
Сохранение строка подключения в переменной среды
AZURE_STORAGE_CONNECTION_STRING=$(az storage account show-connection-string --name <storage-account> --resource-group <resource-group> --output tsv)
Создайте общие папки, необходимые для хранения состояния контейнера и конфигурации caddy.
az storage share create \
--name proxy-caddyfile \
--account-name <storage-account>
az storage share create \
--name proxy-config \
--account-name <storage-account>
az storage share create \
--name proxy-data \
--account-name <storage-account>
Получение ключей учетной записи хранения и запись для последующего использования
az storage account keys list -g <resource-group> -n <storage-account>
Развертывание группы контейнеров
Создание YAML-файла
Создайте файл с именем ci-my-app.yaml
и вставьте следующее содержимое. Убедитесь, что необходимо заменить <account-key>
один из ключей доступа, полученных ранее и <storage-account>
соответственно.
Этот ФАЙЛ YAML определяет два контейнера reverse-proxy
и my-app
. Контейнер reverse-proxy
подключает три ранее созданных файловых ресурса. Конфигурация также предоставляет порты 80/TCP и 443/TCP reverse-proxy
контейнера. Обмен данными между обоими контейнерами выполняется только в localhost.
Примечание.
Важно отметить, что dnsNameLabel
ключ определяет общедоступное DNS-имя, под которым будет достигнута группа экземпляров контейнера, она должна соответствовать полному доменному имени, определенному в . Caddyfile
name: ci-my-app
apiVersion: "2021-10-01"
location: westeurope
properties:
containers:
- name: reverse-proxy
properties:
image: caddy:2.6
ports:
- protocol: TCP
port: 80
- protocol: TCP
port: 443
resources:
requests:
memoryInGB: 1.0
cpu: 1.0
limits:
memoryInGB: 1.0
cpu: 1.0
volumeMounts:
- name: proxy-caddyfile
mountPath: /etc/caddy
- name: proxy-data
mountPath: /data
- name: proxy-config
mountPath: /config
- name: my-app
properties:
image: mcr.microsoft.com/azuredocs/aci-helloworld
ports:
- port: 5000
protocol: TCP
environmentVariables:
- name: PORT
value: 5000
resources:
requests:
memoryInGB: 1.0
cpu: 1.0
limits:
memoryInGB: 1.0
cpu: 1.0
ipAddress:
ports:
- protocol: TCP
port: 80
- protocol: TCP
port: 443
type: Public
dnsNameLabel: my-app
osType: Linux
volumes:
- name: proxy-caddyfile
azureFile:
shareName: proxy-caddyfile
storageAccountName: "<storage-account>"
storageAccountKey: "<account-key>"
- name: proxy-data
azureFile:
shareName: proxy-data
storageAccountName: "<storage-account>"
storageAccountKey: "<account-key>"
- name: proxy-config
azureFile:
shareName: proxy-config
storageAccountName: "<storage-account>"
storageAccountKey: "<account-key>"
Развертывание группы контейнеров
Создайте группу ресурсов с помощью команды az group create.
az group create --name <resource-group> --location westeurope
Разверните группу контейнеров с помощью команды az container create, передав YAML-файл как аргумент.
az container create --resource-group <resource-group> --file ci-my-app.yaml
Просмотр состояния развертывания
Чтобы просмотреть состояние развертывания, используйте следующую команду az container show.
az container show --resource-group <resource-group> --name ci-my-app --output table
Проверка подключения по протоколу TLS
Прежде чем проверить, хорошо ли все прошло, предоставьте группе контейнеров некоторое время для полного запуска и для Caddy, чтобы запросить сертификат.
OpenSSL
Для этого мы можем использовать s_client
подкоманда OpenSSL.
echo "Q" | openssl s_client -connect my-app.westeurope.azurecontainer.io:443
CONNECTED(00000188)
---
Certificate chain
0 s:CN = my-app.westeurope.azurecontainer.io
i:C = US, O = Let's Encrypt, CN = R3
1 s:C = US, O = Let's Encrypt, CN = R3
i:C = US, O = Internet Security Research Group, CN = ISRG Root X1
2 s:C = US, O = Internet Security Research Group, CN = ISRG Root X1
i:O = Digital Signature Trust Co., CN = DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIEgTCCA2mgAwIBAgISAxxidSnpH4vVuCZk9UNG/pd2MA0GCSqGSIb3DQEBCwUA
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
EwJSMzAeFw0yMzA0MDYxODAzMzNaFw0yMzA3MDUxODAzMzJaMC4xLDAqBgNVBAMT
I215LWFwcC53ZXN0ZXVyb3BlLmF6dXJlY29udGFpbmVyLmlvMFkwEwYHKoZIzj0C
AQYIKoZIzj0DAQcDQgAEaaN/wGyFcimM+1O4WzbFgO6vIlXxXqp9vgmLZHpFrNwV
aO8JbaB7hE+M5EAg34LDY80RyHgY+Ff4vTh2Z96rVqOCAl4wggJaMA4GA1UdDwEB
/wQEAwIHgDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/
BAIwADAdBgNVHQ4EFgQUoL5DP+4PWiyE79hL5o+v8uymHdAwHwYDVR0jBBgwFoAU
FC6zF7dYVsuuUAlA5h+vnYsUwsYwVQYIKwYBBQUHAQEESTBHMCEGCCsGAQUFBzAB
hhVodHRwOi8vcjMuby5sZW5jci5vcmcwIgYIKwYBBQUHMAKGFmh0dHA6Ly9yMy5p
LmxlbmNyLm9yZy8wLgYDVR0RBCcwJYIjbXktYXBwLndlc3RldXJvcGUuYXp1cmVj
b250YWluZXIuaW8wTAYDVR0gBEUwQzAIBgZngQwBAgEwNwYLKwYBBAGC3xMBAQEw
KDAmBggrBgEFBQcCARYaaHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwggEEBgor
BgEEAdZ5AgQCBIH1BIHyAPAAdgC3Pvsk35xNunXyOcW6WPRsXfxCz3qfNcSeHQmB
Je20mQAAAYdX8+CQAAAEAwBHMEUCIQC9Ztqd3DXoJhOIHBW+P7ketGrKlVA6nPZl
9CiOrn6t8gIgXHcrbBqItemndRMv+UJ3DaBfTkYOqECecOJCgLhSYNUAdgDoPtDa
PvUGNTLnVyi8iWvJA9PL0RFr7Otp4Xd9bQa9bgAAAYdX8+CAAAAEAwBHMEUCIBJ1
24z44vKFUOLCi1a7ymVuWErkmLb/GtysvcxILaj0AiEAr49hyKfen4BbSTwC8Fg4
/LgZnn2F3uHI+9p+ZMO9xTAwDQYJKoZIhvcNAQELBQADggEBACqxa21eiW3JrZwk
FHgpd6SxhUeecrYXxFNva1Y6G//q2qCmGeKK3GK+ZGPqDtcoASH5t5ghV4dIT4WU
auVDLFVywXzR8PT6QUu3W8QxU+W7406twBf23qMIgrF8PIWhStI5mn1uCpeqlnf5
HpRaj2f5/5n19pcCZcrRx94G9qhPYdMzuy4mZRhxXRqrpIsabqX3DC2ld8dszCvD
pkV61iuARgm3MIQz1yL/x5Bn4nywjnhYZA4KFktC0Ti55cPRh1mkzGQAsYQDdWrq
dVav+U9dOLQ4Sq4suaDmzDzApr+hpQSJhwgRN16+tLMyZ6INAU2JWKDxiyDTdOuH
jz456og=
-----END CERTIFICATE-----
subject=CN = my-app.westeurope.azurecontainer.io
issuer=C = US, O = Let's Encrypt, CN = R3
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: ECDSA
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 4208 bytes and written 401 bytes
Verification error: unable to get local issuer certificate
---
New, TLSv1.3, Cipher is TLS_AES_128_GCM_SHA256
Server public key is 256 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 20 (unable to get local issuer certificate)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
Protocol : TLSv1.3
Cipher : TLS_AES_128_GCM_SHA256
Session-ID: 85F1A4290F99A0DD28C8CB21EF4269E7016CC5D23485080999A8548057729B24
Session-ID-ctx:
Resumption PSK: 752D438C19A5DBDBF10781F863D5E5D9A8859230968A9EAFFF7BBA86937D004F
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 604800 (seconds)
TLS session ticket:
0000 - 2f 25 98 90 9d 46 9b 01-03 78 db bd 4d 64 b3 a6 /%...F...x..Md..
0010 - 52 c0 7a 8a b6 3d b8 4b-c0 d7 fc 04 e8 63 d4 bb R.z..=.K.....c..
0020 - 15 b3 25 b7 be 64 3d 30-2b d7 dc 7a 1a d1 22 63 ..%..d=0+..z.."c
0030 - 42 30 90 65 6b b5 e1 83-a3 6c 76 c8 f6 ae e9 31 B0.ek....lv....1
0040 - 45 91 33 57 8e 9f 4b 6a-2e 2c 9b f9 87 5f 71 1d E.3W..Kj.,..._q.
0050 - 5a 84 59 50 17 31 1f 62-2b 0e 1e e5 70 03 d9 e9 Z.YP.1.b+...p...
0060 - 50 1c 5d 1f a4 3c 8a 0e-f4 c5 7d ce 9e 5c 98 de P.]..<....}..\..
0070 - e5 .
Start Time: 1680808973
Timeout : 7200 (sec)
Verify return code: 20 (unable to get local issuer certificate)
Extended master secret: no
Max Early Data: 0
---
read R BLOCK
Браузер Chrome
Перейдите к https://my-app.westeurope.azurecontainer.io
сертификату и проверьте его, щелкнув блокировку рядом с URL-адресом.
Чтобы просмотреть сведения о сертификате, выберите "Подключение безопасно" и "Сертификат действителен".