Povolení automatického HTTPS s Caddy v kontejneru sajdkár
Tento článek popisuje, jak lze Caddy použít jako kontejner sajdkár ve skupině kontejnerů fungující jako reverzní proxy k poskytování automaticky spravovaného koncového bodu HTTPS pro vaši aplikaci.
Caddy je výkonný webový server open source připravený pro podniky s automatickým HTTPS napsaným v Go a představuje alternativu k Nginx.
Automatizace certifikátů je možná, protože Caddy podporuje rozhraní API ACMEv2 (RFC 8555), které při vydávání certifikátů komunikuje s let's Encrypt .
V tomto příkladu se na portech 80/TCP a 443/TCP zobrazí pouze kontejner Caddy. Aplikace za reverzním proxy serverem zůstává soukromá. Síťová komunikace mezi Caddy a vaší aplikací probíhá přes localhost.
Poznámka
To je v kontrastu ke komunikaci uvnitř skupiny kontejnerů známé z docker compose, kde se na kontejnery dá odkazovat podle názvu.
Příklad připojí soubor caddy, který je nutný ke konfiguraci reverzního proxy serveru, ze sdílené složky hostované v účtu služby Azure Storage.
Poznámka
U produkčních nasazení bude většina uživatelů chtít vložit soubor Caddy do vlastní image Dockeru založené na caddy. Díky tomu není potřeba připojovat soubory ke kontejneru.
Požadavky
Použijte prostředí Bash v Azure Cloud Shell. Další informace najdete v tématu Rychlý start pro Bash v Azure Cloud Shell.
Pokud dáváte přednost místnímu spouštění referenčních příkazů rozhraní příkazového řádku, nainstalujte Azure CLI. Pokud používáte Windows nebo macOS, zvažte spuštění Azure CLI v kontejneru Docker. Další informace najdete v tématu Spuštění Azure CLI v kontejneru Dockeru.
Pokud používáte místní instalaci, přihlaste se k Azure CLI pomocí příkazu az login. Pokud chcete dokončit proces ověřování, postupujte podle kroků zobrazených na terminálu. Další možnosti přihlášení najdete v tématu Přihlášení pomocí Azure CLI.
Po zobrazení výzvy nainstalujte rozšíření Azure CLI při prvním použití. Další informace o rozšířeních najdete v tématu Využití rozšíření v Azure CLI.
Spuštěním příkazu az version zjistěte verzi a závislé knihovny, které jsou nainstalované. Pokud chcete upgradovat na nejnovější verzi, spusťte az upgrade.
- Tento článek vyžaduje Azure CLI verze 2.0.55 nebo novější. Pokud používáte Azure Cloud Shell, je už nainstalovaná nejnovější verze.
Příprava souboru Caddyfile
Vytvořte soubor s názvem Caddyfile
a vložte následující konfiguraci. Tato konfigurace vytvoří konfiguraci reverzního proxy serveru odkazující na kontejner aplikace, který naslouchá na portu 5000/TCP.
my-app.westeurope.azurecontainer.io {
reverse_proxy http://localhost:5000
}
Je důležité si uvědomit, že konfigurace odkazuje na název domény místo NA IP adresu. Caddy musí být přes tuto adresu URL dosažitelný, aby mohl provést krok výzvy vyžadovaný protokolem ACME a úspěšně načíst certifikát z Let's Encrypt.
Poznámka
Pro produkční nasazení můžou uživatelé chtít použít název domény, který řídí, api.company.com
například a vytvořit záznam CNAME odkazující na například my-app.westeurope.azurecontainer.io
. Pokud ano, je potřeba zajistit, aby se vlastní název domény používal také v souboru Caddy místo názvu přiřazeného Azure (např. *.westeurope.azurecontainer.io
). Dále je potřeba odkazovat na název vlastní domény v konfiguraci ACI YAML popsané dále v tomto příkladu.
Příprava účtu úložiště
Vytvoření účtu úložiště
az storage account create \
--name <storage-account> \
--resource-group <resource-group> \
--location westeurope
Uložení připojovacího řetězce do proměnné prostředí
AZURE_STORAGE_CONNECTION_STRING=$(az storage account show-connection-string --name <storage-account> --resource-group <resource-group> --output tsv)
Vytvořte sdílené složky potřebné k uložení stavu kontejneru a konfigurace 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>
Načtěte klíče účtu úložiště a poznamenejte si je k pozdějšímu použití.
az storage account keys list -g <resource-group> -n <storage-account>
Nasazení skupiny kontejnerů
Vytvoření souboru YAML
Vytvořte soubor s názvem ci-my-app.yaml
a vložte následující obsah. Nezapomeňte nahradit <account-key>
jedním z dříve přijatých přístupových klíčů a <storage-account>
odpovídajícím způsobem.
Tento soubor YAML definuje dva kontejnery reverse-proxy
a my-app
. Kontejner reverse-proxy
připojí tři dříve vytvořené sdílené složky. Konfigurace také zpřístupní porty 80/TCP a 443/TCP kontejneru reverse-proxy
. Komunikace mezi oběma kontejnery probíhá pouze na místním hostiteli.
Poznámka
Je důležité si uvědomit, že dnsNameLabel
klíč definuje veřejný název DNS, pod kterým bude skupina instancí kontejneru dostupná, musí odpovídat plně kvalifikovanému názvu domény definovanému v 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>"
Nasazení skupiny kontejnerů
Vytvořte skupinu prostředků pomocí příkazu az group create :
az group create --name <resource-group> --location westeurope
Nasaďte skupinu kontejnerů pomocí příkazu az container create a jako argument předejte soubor YAML.
az container create --resource-group <resource-group> --file ci-my-app.yaml
Zobrazení stavu nasazení
Pokud chcete zobrazit stav nasazení, použijte následující příkaz az container show :
az container show --resource-group <resource-group> --name ci-my-app --output table
Ověření připojení TLS
Než ověříte, jestli všechno proběhlo správně, dejte skupině kontejnerů nějaký čas na úplné spuštění a aby si Caddy vyžádal certifikát.
OpenSSL
Pro tento účel můžeme použít s_client
podpříkaz 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
Prohlížeč Chrome
Přejděte na https://my-app.westeurope.azurecontainer.io
adresu a ověřte certifikát kliknutím na zámek vedle adresy URL.
Pokud chcete zobrazit podrobnosti o certifikátu, klikněte na "Připojení je zabezpečené" a pak na "certifikát je platný".