Share via


在虛擬網路中使用端對端 TLS 公開應用程式

注意

Azure Spring Apps 是 Azure Spring Cloud 服務的新名稱。 雖然服務有新的名稱,但在我們努力更新資產,例如螢幕快照、影片和圖表時,您會在某些地方看到舊名稱一段時間。

本文適用於: ✔️基本/標準✔️企業

本文說明如何使用 應用程式閘道 向因特網公開應用程式。 當您的虛擬網路中部署 Azure Spring Apps 服務實例時,服務實例上的應用程式只能在專用網中存取。 若要讓應用程式可在因特網上存取,您需要與 Azure 應用程式閘道 整合。

必要條件

  • Azure CLI 2.0.4 版或更新版本。
  • 部署在虛擬網路中的 Azure Spring Apps 服務實例,其應用程式會使用預設 .private.azuremicroservices.io 網域後綴透過專用網存取。 如需詳細資訊,請參閱 在虛擬網路中部署 Azure Spring Apps
  • 要用來存取應用程式的自定義網域。
  • 儲存在 金鑰保存庫 中的憑證,其符合用來建立 HTTPS 接聽程式的自定義網域。 如需詳細資訊,請參閱教學課程:在 Azure 金鑰保存庫 匯入憑證。

設定 Azure Spring Apps 的 應用程式閘道

我們建議瀏覽器所見的功能變數名稱與 應用程式閘道 用來將流量導向 Azure Spring Apps 後端的主機名相同。 使用 應用程式閘道 來公開裝載於 Azure Spring Apps 且位於虛擬網路中的應用程式時,這項建議提供最佳體驗。 如果 應用程式閘道 公開的網域與 Azure Spring Apps 所接受的網域不同,則 Cookie 和產生的重新導向 URL 可能會中斷。 如需詳細資訊,請參閱 主機名保留

若要在 Azure Spring Apps 前面設定 應用程式閘道,請使用下列步驟。

  1. 遵循在虛擬網路中部署 Azure Spring Apps 中的指示。
  2. 遵循在專用網中存取您的應用程式中的指示。
  3. 取得所選網域的憑證,並將該憑證儲存在 金鑰保存庫 中。 如需詳細資訊,請參閱教學課程:在 Azure 金鑰保存庫 匯入憑證。
  4. 在部署至 Azure Spring Apps 的應用程式上,設定來自 金鑰保存庫 的自定義網域和對應的憑證。 如需詳細資訊,請參閱 教學課程:將現有的自定義網域對應至 Azure Spring Apps
  5. 根據下列清單,在設定的虛擬網路中部署 應用程式閘道:
    • 在後端集區中使用 Azure Spring Apps,由後綴為 private.azuremicroservices.io的網域所參考。
    • 使用來自 金鑰保存庫 的相同憑證來包含 HTTPS 接聽程式。
    • 使用在 Azure Spring Apps 上設定的自定義功能變數名稱,而不是後綴為 private.azuremicroservices.io的網域,使用 HTTP 設定來設定虛擬網路。
  6. 將您的公用 DNS 設定為指向 應用程式閘道。

定義變數

接下來,使用下列命令來定義您在虛擬網路中部署 Azure Spring Apps 中所 指示所建立之資源群組和虛擬網路的變數。 根據您的實際環境自定義值。 當您定義 SPRING_APP_PRIVATE_FQDN時,請從 URI 移除 https://

export SUBSCRIPTION='subscription-id'
export RESOURCE_GROUP='my-resource-group'
export LOCATION='eastus'
export SPRING_CLOUD_NAME='name-of-spring-cloud-instance'
export APPNAME='name-of-app-in-azure-spring-apps'
export SPRING_APP_PRIVATE_FQDN='$APPNAME.private.azuremicroservices.io'
export VIRTUAL_NETWORK_NAME='azure-spring-apps-vnet'
export APPLICATION_GATEWAY_SUBNET_NAME='app-gw-subnet'
export APPLICATION_GATEWAY_SUBNET_CIDR='10.1.2.0/24'

登入 Azure

使用下列命令登入 Azure CLI,然後選擇作用中的訂用帳戶。

az login
az account set --subscription $SUBSCRIPTION

取得憑證

針對生產環境部署,您很可能會使用公開簽署的憑證。 在此情況下,請在 Azure 金鑰保存庫 中匯入憑證。 如需詳細資訊,請參閱教學課程:在 Azure 金鑰保存庫 匯入憑證。 請確定憑證包含整個憑證鏈結。

在 Azure Spring Apps 上設定公用網域名稱

流量會輸入使用公用功能變數名稱在 Azure Spring Apps 上部署的應用程式。 若要將應用程式設定為接聽此主機名,並透過 HTTPS 執行此動作,請使用下列命令將自訂網域新增至您的應用程式:

export KV_NAME='name-of-key-vault'
export KV_RG='resource-group-name-of-key-vault'
export CERT_NAME_IN_AZURE_SPRING_APPS='name-of-certificate-in-Azure-Spring-Apps'
export CERT_NAME_IN_KEY_VAULT='name-of-certificate-with-intermediaries-in-key-vault'
export DOMAIN_NAME=myapp.mydomain.com

# provide permissions to Azure Spring Apps to read the certificate from Key Vault:
export VAULTURI=$(az keyvault show \
    --resource-group $KV_RG \
    --name $KV_NAME \
    --query properties.vaultUri \
    --output tsv)

# get the object id for the Azure Spring Apps Domain-Management Service Principal:
export ASADM_OID=$(az ad sp show \
    --id 03b39d0f-4213-4864-a245-b1476ec03169 \
    --query objectId \
    --output tsv)

# allow this Service Principal to read and list certificates and secrets from Key Vault:
az keyvault set-policy \
    --resource-group $KV_RG \
    --name $KV_NAME \
    --object-id $ASADM_OID \
    --certificate-permissions get list \
    --secret-permissions get list

# add custom domain name and configure TLS using the certificate:
az spring certificate add \
    --resource-group $RESOURCE_GROUP \
    --service $SPRING_CLOUD_NAME \
    --name $CERT_NAME_IN_AZURE_SPRING_APPS \
    --vault-certificate-name $CERT_NAME_IN_KEY_VAULT \
    --vault-uri $VAULTURI
az spring app custom-domain bind \
    --resource-group $RESOURCE_GROUP \
    --service $SPRING_CLOUD_NAME \
    --domain-name $DOMAIN_NAME \
    --certificate $CERT_NAME_IN_AZURE_SPRING_APPS \
    --app $APPNAME

建立網路資源

要建立的 Azure 應用程式閘道 會加入與 Azure Spring Apps 服務實例相同的虛擬網路,或對等互連的虛擬網路。 首先,使用 az network vnet subnet create在虛擬網路中建立 應用程式閘道 的新子網,並使用 建立公用IP位址作為 應用程式閘道az network public-ip create的前端。

export APPLICATION_GATEWAY_PUBLIC_IP_NAME='app-gw-public-ip'
az network vnet subnet create \
    --name $APPLICATION_GATEWAY_SUBNET_NAME \
    --resource-group $RESOURCE_GROUP \
    --vnet-name $VIRTUAL_NETWORK_NAME \
    --address-prefix $APPLICATION_GATEWAY_SUBNET_CIDR
az network public-ip create \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION \
    --name $APPLICATION_GATEWAY_PUBLIC_IP_NAME \
    --allocation-method Static \
    --sku Standard

建立 應用程式閘道 的受控識別

應用程式閘道 必須能夠存取 金鑰保存庫 來讀取憑證。 若要這樣做,它會使用使用者指派的 受控識別。 使用下列命令建立受控識別:

export APPGW_IDENTITY_NAME='name-for-appgw-managed-identity'
az identity create \
    --resource-group $RESOURCE_GROUP \
    --name $APPGW_IDENTITY_NAME

然後擷取受控識別的 objectId,因為它稍後會用來授與許可權以存取 金鑰保存庫 中的憑證:

export APPGW_IDENTITY_CLIENTID=$(az identity show \
    --resource-group $RESOURCE_GROUP \
    --name $APPGW_IDENTITY_NAME \
    --query clientId \
    --output tsv)
export APPGW_IDENTITY_OID=$(az ad sp show \
    --id $APPGW_IDENTITY_CLIENTID \
    --query objectId \
    --output tsv)

在 金鑰保存庫 上設定原則

使用下列命令設定 金鑰保存庫,讓 應用程式閘道 的受控識別能夠存取儲存在 金鑰保存庫 中的憑證:

az keyvault set-policy \
    --name $KV_NAME \
    --resource-group $KV_RG \
    --object-id $APPGW_IDENTITY_OID \
    --secret-permissions get list \
    --certificate-permissions get list

建立 應用程式閘道

使用 az network application-gateway create 建立應用程式閘道,並將應用程式的私人完整功能變數名稱 (FQDN) 指定為後端集區中的伺服器。 請務必使用使用者指派的受控識別,並使用憑證的秘密標識碼指向 金鑰保存庫 中的憑證。 然後使用 更新 HTTP 設定 az network application-gateway http-settings update ,以使用公用主機名。

export APPGW_NAME='name-for-application-gateway'

export KEYVAULT_SECRET_ID_FOR_CERT=$(az keyvault certificate show \
    --name $CERT_NAME_IN_KEY_VAULT \
    --vault-name $KV_NAME \
    --query sid \
    --output tsv)

az network application-gateway create \
    --name $APPGW_NAME \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION \
    --capacity 2 \
    --sku Standard_v2 \
    --frontend-port 443 \
    --http-settings-cookie-based-affinity Disabled \
    --http-settings-port 443 \
    --http-settings-protocol Https \
    --public-ip-address $APPLICATION_GATEWAY_PUBLIC_IP_NAME \
    --vnet-name $VIRTUAL_NETWORK_NAME \
    --subnet $APPLICATION_GATEWAY_SUBNET_NAME \
    --servers $SPRING_APP_PRIVATE_FQDN \
    --key-vault-secret-id $KEYVAULT_SECRET_ID_FOR_CERT \
    --identity $APPGW_IDENTITY_NAME

Azure 最多可能需要 30 分鐘的時間才能建立應用程式閘道。

更新 HTTP 設定 以將功能變數名稱用於後端

更新 HTTP 設定,以使用公用功能變數名稱作為主機名,而不是後綴為 “.private.azuremicroservices.io” 的網域,以使用 將流量傳送至 Azure Spring Apps。

az network application-gateway http-settings update \
    --resource-group $RESOURCE_GROUP \
    --gateway-name $APPGW_NAME \
    --host-name-from-backend-pool false \
    --host-name $DOMAIN_NAME \
    --name appGatewayBackendHttpSettings

檢查部署 應用程式閘道

建立之後,請使用下列命令檢查後端健康情況。 此命令的輸出可讓您判斷應用程式閘道是否透過其私人 FQDN 連線到您的應用程式。

az network application-gateway show-backend-health \
    --name $APPGW_NAME \
    --resource-group $RESOURCE_GROUP

輸出會指出後端集區的健康狀態,如下列範例所示:

{
  "backendAddressPools": [
    {
      "backendHttpSettingsCollection": [
        {
          "servers": [
            {
              "address": "my-azure-spring-apps-hello-vnet.private.azuremicroservices.io",
              "health": "Healthy",
              "healthProbeLog": "Success. Received 200 status code",
              "ipConfiguration": null
            }
          ]
        }
      ]
    }
  ]
}

設定 DNS 並存取應用程式

現在,將公用 DNS 設定為使用 CNAME 或 A-record 指向 應用程式閘道。 您可以使用下列命令來尋找 應用程式閘道 的公用位址:

az network public-ip show \
    --resource-group $RESOURCE_GROUP \
    --name $APPLICATION_GATEWAY_PUBLIC_IP_NAME \
    --query [ipAddress] \
    --output tsv

您現在可以使用公用功能變數名稱來存取應用程式。

下一步