Aktivera automatisk HTTPS med Caddy i en sidovagnscontainer
Den här artikeln beskriver hur Caddy kan användas som en sidovagnscontainer i en containergrupp och fungera som en omvänd proxy för att tillhandahålla en automatiskt hanterad HTTPS-slutpunkt för ditt program.
Caddy är en kraftfull, företagsklar webbserver med öppen källkod med automatisk HTTPS skriven i Go och representerar ett alternativ till Nginx.
Det går att automatisera certifikat eftersom Caddy stöder ACMEv2 API (RFC 8555) som interagerar med Let's Encrypt för att utfärda certifikat.
I det här exemplet exponeras endast Caddy-containern på portarna 80/TCP och 443/TCP. Programmet bakom den omvända proxyn förblir privat. Nätverkskommunikationen mellan Caddy och ditt program sker via localhost.
Kommentar
Detta står i kontrast till kommunikationen mellan containergrupper som är känd från docker compose, där containrar kan refereras med namn.
Exemplet monterar Caddyfile, som krävs för att konfigurera den omvända proxyn, från en filresurs som finns på ett Azure Storage-konto.
Kommentar
För produktionsdistributioner vill de flesta användare baka Caddyfile till en anpassad docker-avbildning baserat på caddy. På så sätt behöver du inte montera filer i containern.
Förutsättningar
Använd Bash-miljön i Azure Cloud Shell. Mer information finns i Snabbstart för Bash i Azure Cloud Shell.
Om du föredrar att köra CLI-referenskommandon lokalt installerar du Azure CLI. Om du kör i Windows eller macOS kan du köra Azure CLI i en Docker-container. Mer information finns i Så här kör du Azure CLI i en Docker-container.
Om du använder en lokal installation loggar du in på Azure CLI med hjälp av kommandot az login. Slutför autentiseringsprocessen genom att följa stegen som visas i terminalen. Andra inloggningsalternativ finns i Logga in med Azure CLI.
När du uppmanas att installera Azure CLI-tillägget vid första användningen. Mer information om tillägg finns i Använda tillägg med Azure CLI.
Kör az version om du vill hitta versionen och de beroende bibliotek som är installerade. Om du vill uppgradera till den senaste versionen kör du az upgrade.
- Den här artikeln kräver version 2.0.55 eller senare av Azure CLI. Om du använder Azure Cloud Shell är den senaste versionen redan installerad.
Förbereda Caddyfile
Skapa en fil med namnet Caddyfile
och klistra in följande konfiguration. Den här konfigurationen skapar en omvänd proxykonfiguration som pekar på att programcontainern lyssnar på 5000/TCP.
my-app.westeurope.azurecontainer.io {
reverse_proxy http://localhost:5000
}
Det är viktigt att notera att konfigurationen refererar till ett domännamn i stället för en IP-adress. Caddy måste kunna nås med den här URL:en för att utföra det utmaningssteg som krävs av ACME-protokollet och för att kunna hämta ett certifikat från Let's Encrypt.
Kommentar
För produktionsdistribution kanske användarna vill använda ett domännamn som de kontrollerar, t.ex. api.company.com
och skapa en CNAME-post som pekar på t.ex. my-app.westeurope.azurecontainer.io
. I så fall måste det säkerställas att det anpassade domännamnet också används i Caddyfile i stället för det som tilldelats av Azure (t.ex. *.westeurope.azurecontainer.io
). Dessutom måste det anpassade domännamnet refereras till i ACI YAML-konfigurationen som beskrivs senare i det här exemplet.
Förbereda lagringskonto
Skapa ett lagringskonto
az storage account create \
--name <storage-account> \
--resource-group <resource-group> \
--location westeurope
Lagra niska veze till en miljövariabel
AZURE_STORAGE_CONNECTION_STRING=$(az storage account show-connection-string --name <storage-account> --resource-group <resource-group> --output tsv)
Skapa de filresurser som krävs för att lagra containertillståndet och caddy-konfigurationen.
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>
Hämta lagringskontonycklarna och anteckna för senare användning
az storage account keys list -g <resource-group> -n <storage-account>
Distribuera containergrupp
Skapa YAML-fil
Skapa en fil med namnet ci-my-app.yaml
och klistra in följande innehåll. Se till att ersätta <account-key>
med en av de åtkomstnycklar som tidigare tagits emot och <storage-account>
därefter.
Den här YAML-filen definierar två containrar reverse-proxy
och my-app
. Containern reverse-proxy
monterar de tre tidigare skapade filresurserna. Konfigurationen exponerar även port 80/TCP och 443/TCP för containern reverse-proxy
. Kommunikationen mellan båda containrarna sker endast på localhost.
Kommentar
Det är viktigt att observera att dnsNameLabel
nyckeln definierar det offentliga DNS-namnet, under vilket containerinstansgruppen kan nås, den måste matcha det FQDN som definierats i 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>"
Distribuera containergruppen
Skapa en resursgrupp med kommandot az group create :
az group create --name <resource-group> --location westeurope
Distribuera containergruppen med kommandot az container create och skicka YAML-filen som ett argument.
az container create --resource-group <resource-group> --file ci-my-app.yaml
Visa distributionstillståndet
Om du vill visa distributionens tillstånd använder du följande kommando az container show :
az container show --resource-group <resource-group> --name ci-my-app --output table
Verifiera TLS-anslutningen
Innan du verifierar om allt gick bra kan du ge containergruppen lite tid att starta helt och att Caddy kan begära ett certifikat.
OpenSSL
Vi kan använda s_client
underkommandot för OpenSSL för det ändamålet.
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
Webbläsaren Chrome
Navigera till https://my-app.westeurope.azurecontainer.io
och verifiera certifikatet genom att klicka på hänglåset bredvid URL:en.
Om du vill se certifikatinformationen väljer du "Anslutningen är säker" följt av "certifikatet är giltigt".