Aracılığıyla paylaş


Sepet kapsayıcısında Caddy ile otomatik HTTPS'yi etkinleştirme

Bu makalede Caddy'nin bir kapsayıcı grubunda sepet kapsayıcısı olarak nasıl kullanılabileceğini ve uygulamanız için otomatik olarak yönetilen bir HTTPS uç noktası sağlamak üzere ters ara sunucu olarak nasıl davranabileceği açıklanmaktadır.

Caddy, Go ile yazılmış otomatik HTTPS'ye sahip güçlü, kurumsal kullanıma hazır açık kaynak bir web sunucusudur ve Nginx'e bir alternatifi temsil eder.

Caddy, sertifika vermek için Let's Encrypt ile etkileşim kuran ACMEv2 API'sini (RFC 8555) desteklediğinden sertifikaların otomatikleştirilmesi mümkündür.

Bu örnekte yalnızca Caddy kapsayıcısı 80/TCP ve 443/TCP bağlantı noktalarında kullanıma sunulur. Ters proxy'nin arkasındaki uygulama özel kalır. Caddy ile uygulamanız arasındaki ağ iletişimi localhost aracılığıyla gerçekleşir.

Not

Bu, kapsayıcılara adla başvurulabildiği docker compose'dan bilinen kapsayıcı grubu içi iletişimin aksinedir.

Örnek, Bir Azure Depolama hesabında barındırılan bir dosya paylaşımından ters ara sunucuyu yapılandırmak için gereken Caddyfile dosyasını bağlar.

Not

Üretim dağıtımları için kullanıcıların çoğu Caddyfile dosyasını caddy tabanlı özel bir docker görüntüsünde pişirmek isteyecektir. Bu şekilde, dosyaları kapsayıcıya bağlamanız gerekmez.

Önkoşullar

  • Azure Cloud Shell'de Bash ortamını kullanın. Daha fazla bilgi için bkz . Azure Cloud Shell'de Bash için hızlı başlangıç.

  • CLI başvuru komutlarını yerel olarak çalıştırmayı tercih ediyorsanız Azure CLI'yı yükleyin . Windows veya macOS üzerinde çalışıyorsanız Azure CLI’yi bir Docker kapsayıcısında çalıştırmayı değerlendirin. Daha fazla bilgi için bkz . Docker kapsayıcısında Azure CLI'yi çalıştırma.

    • Yerel yükleme kullanıyorsanız az login komutunu kullanarak Azure CLI ile oturum açın. Kimlik doğrulama işlemini tamamlamak için terminalinizde görüntülenen adımları izleyin. Diğer oturum açma seçenekleri için bkz . Azure CLI ile oturum açma.

    • İstendiğinde, ilk kullanımda Azure CLI uzantısını yükleyin. Uzantılar hakkında daha fazla bilgi için bkz. Azure CLI ile uzantıları kullanma.

    • Yüklü sürümü ve bağımlı kitaplıkları bulmak için az version komutunu çalıştırın. En son sürüme yükseltmek için az upgrade komutunu çalıştırın.

  • Bu makale, Azure CLI'nın 2.0.55 veya sonraki bir sürümünü gerektirir. Azure Cloud Shell kullanılıyorsa en son sürüm zaten yüklüdür.

Caddyfile'ı hazırlama

adlı Caddyfile bir dosya oluşturun ve aşağıdaki yapılandırmayı yapıştırın. Bu yapılandırma, 5000/TCP üzerinde dinleyen uygulama kapsayıcınıza işaret eden bir ters proxy yapılandırması oluşturur.

my-app.westeurope.azurecontainer.io {
    reverse_proxy http://localhost:5000
}

Yapılandırmanın IP adresi yerine bir etki alanı adına başvurduğunu unutmayın. ACME protokolü için gerekli sınama adımını gerçekleştirmek ve Let's Encrypt'ten başarıyla sertifika almak için Caddy'ye bu URL tarafından ulaşılması gerekir.

Not

Üretim dağıtımı için, kullanıcılar denetledikleri bir etki alanı adı kullanmak isteyebilir; örneğin, api.company.com öğesine işaret eden bir CNAME kaydı oluşturabilir. my-app.westeurope.azurecontainer.io Bu durumda, özel etki alanı adının Azure tarafından atanan ad yerine Caddyfile'da da kullanıldığından emin olunması gerekir (örn. *.westeurope.azurecontainer.io). Ayrıca, özel etki alanı adına bu örneğin devamında açıklanan ACI YAML yapılandırmasında başvurulmalıdır.

Depolama hesabını hazırlama

Depolama hesabı oluşturma

az storage account create \
  --name <storage-account> \
  --resource-group <resource-group> \
  --location westeurope

bağlantı dizesi bir ortam değişkenine depolama

AZURE_STORAGE_CONNECTION_STRING=$(az storage account show-connection-string --name <storage-account> --resource-group <resource-group> --output tsv)

Kapsayıcı durumunu ve caddy yapılandırmasını depolamak için gereken dosya paylaşımlarını oluşturun.

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>

Depolama hesabı anahtarlarını alın ve daha sonra kullanmak üzere not alın

az storage account keys list -g <resource-group> -n <storage-account>

Kapsayıcı grubunu dağıtma

YAML dosyası oluşturma

adlı ci-my-app.yaml bir dosya oluşturun ve aşağıdaki içeriği yapıştırın. yerine <account-key> daha önce alınan ve <storage-account> buna uygun erişim anahtarlarından birini girdiğinizden emin olun.

Bu YAML dosyası iki kapsayıcı reverse-proxy ve my-apptanımlar. Kapsayıcı, reverse-proxy önceden oluşturulmuş üç dosya paylaşımını bağlar. Yapılandırma ayrıca kapsayıcının 80/TCP ve 443/TCP reverse-proxy bağlantı noktalarını da kullanıma sunar. Her iki kapsayıcı arasındaki iletişim yalnızca localhost üzerinde gerçekleşir.

Not

Anahtarın dnsNameLabel , kapsayıcı örneği grubuna ulaşılabilen genel DNS adını tanımladığını ve içinde tanımlanan FQDN ile eşleşmesi gerektiğini unutmayın 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>"

Kapsayıcı grubunu dağıtma

az group create komutuyla bir kaynak grubu oluşturun :

az group create --name <resource-group> --location westeurope

Kapsayıcı grubunu az container create komutuyla dağıtın ve YAML dosyasını bağımsız değişken olarak geçirin.

az container create --resource-group <resource-group> --file ci-my-app.yaml

Dağıtım durumunu görüntüleme

Dağıtımın durumunu görüntülemek için aşağıdaki az container show komutunu kullanın:

az container show --resource-group <resource-group> --name ci-my-app --output table

TLS bağlantısını doğrulama

Her şeyin yolunda gidip gitmediğini doğrulamadan önce kapsayıcı grubuna tamamen başlaması ve Caddy'nin sertifika istemesi için biraz zaman tanıyın.

OpenSSL

Bu amaçla OpenSSL alt komutunu kullanabiliriz s_client .

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 tarayıcısı

URL'nin https://my-app.westeurope.azurecontainer.io yanındaki asma kilit simgesine tıklayarak sertifikaya gidin ve sertifikayı doğrulayın.

Sertifikayı doğrulayan URL'nin yanındaki asma kilidi vurgulayan ekran görüntüsü.

Sertifika ayrıntılarını görmek için "Bağlantı güvenli" seçeneğini ve ardından "sertifika geçerli" seçeneğini belirleyin.

Let's Encrypt tarafından verilen sertifikanın ekran görüntüsü

Sonraki adımlar