Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este guia de início rápido mostra como implantar um Gateway de Aplicativo do Azure com passagem de TLS mútua (mTLS) usando um modelo do ARM e uma versão 2025-03-01da API. No modo de passagem, o gateway solicita um certificado do cliente, mas não o valida. A validação do certificado e a imposição de política ocorrem no back-end.
Características principais
- Associe um perfil SSL ao ouvinte da passagem mTLS.
- Nenhum certificado de assinatura do cliente necessário no gateway.
-
verifyClientAuthModesuportaStrictePassthrough.
Observação
No momento, o suporte ao Portal, ao PowerShell e à CLI para a configuração de passagem não está disponível. Para a finalidade deste guia, use modelos do ARM.
Pré-requisitos
- Assinatura e grupo de recursos do Azure
- A CLI do Azure instalada.
- Certificado SSL (PFX codificado em Base64) e senha.
- Chave SSH para administrador de VM do Linux (se aplicável).
- Versão da API
2025-03-01para a propriedade de passagem.
Implantar o Gateway de Aplicativo com o ouvinte de passagem mTLS
Este modelo cria:
- Uma Rede Virtual com duas sub-redes (uma delegada ao Gateway de Aplicativo).
- Um endereço IP público para o front-end do gateway.
- Um Gateway de Aplicativo (Standard_v2) com:
- Certificado SSL e perfil SSL para passagem de certificado do cliente.
- Regra de roteamento e ouvinte HTTPS.
- Pool de back-end apontando para um serviço de aplicativo. Atualize o modelo com seus detalhes de configuração e inclua um certificado SSL válido.
Arquivo de parâmetro: deploymentParameters.json
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"addressPrefix": {
"value": "10.0.0.0/16"
},
"subnetPrefix": {
"value": "10.0.0.0/24"
},
"skuName": {
"value": "Standard_v2"
},
"capacity": {
"value": 2
},
"adminUsername": {
"value": "ubuntu"
},
"adminSSHKey": {
"value": "<your-ssh-public-key>"
},
"certData": {
"value": "<Base64-encoded-PFX-data>"
},
"certPassword": {
"value": "<certificate-password>"
}
}
}
Arquivo de modelo: deploymentTemplate.json
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"addressPrefix": {
"defaultValue": "10.0.0.0/16",
"type": "String",
"metadata": {
"description": "Address prefix for the Virtual Network"
}
},
"subnetPrefix": {
"defaultValue": "10.0.0.0/24",
"type": "String",
"metadata": {
"description": "Subnet prefix"
}
},
"skuName": {
"defaultValue": "Standard_Medium",
"type": "String",
"metadata": {
"description": "Sku Name"
}
},
"capacity": {
"defaultValue": 2,
"type": "Int",
"metadata": {
"description": "Number of instances"
}
},
"adminUsername": {
"type": "String"
},
"adminSSHKey": {
"type": "securestring"
},
"certData": {
"type": "String",
"metadata": {
"description": "ssl cert data"
}
},
"certPassword": {
"type": "SecureString",
"metadata": {
"description": "ssl cert password"
}
}
},
"variables": {
"applicationGatewayName": "mtlsAppGw",
"idName": "identity",
"publicIPAddressName": "mtlsPip",
"virtualNetworkName": "mtlsVnet",
"subnetName": "appgwsubnet",
"vnetID": "[resourceId('Microsoft.Network/virtualNetworks',variables('virtualNetworkName'))]",
"subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]",
"publicIPRef": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]",
"applicationGatewayID": "[resourceId('Microsoft.Network/applicationGateways',variables('applicationGatewayName'))]",
"apiVersion": "2025-03-01",
"identityID": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities',variables('idName'))]",
"backendSubnetId": "[concat(variables('vnetID'),'/subnets/backendsubnet')]"
},
"resources": [
{
"type": "Microsoft.Network/virtualNetworks",
"name": "[variables('virtualNetworkName')]",
"apiVersion": "2024-07-01",
"location": "[resourceGroup().location]",
"properties": {
"addressSpace": {
"addressPrefixes": [
"[parameters('addressPrefix')]"
]
},
"subnets": [
{
"name": "[variables('subnetName')]",
"properties": {
"addressPrefix": "[parameters('subnetPrefix')]",
"delegations": [
{
"name": "Microsoft.Network/applicationGateways",
"properties": {
"serviceName": "Microsoft.Network/applicationGateways"
}
}
]
}
},
{
"name": "backendSubnet",
"properties": {
"addressPrefix": "10.0.2.0/24"
}
}
]
}
},
{
"type": "Microsoft.Network/publicIPAddresses",
"sku": {
"name": "Standard"
},
"name": "[variables('publicIPAddressName')]",
"apiVersion": "2024-07-01",
"location": "[resourceGroup().location]",
"properties": {
"publicIPAllocationMethod": "Static"
}
},
{
"type": "Microsoft.Network/applicationGateways",
"name": "[variables('applicationGatewayName')]",
"apiVersion": "[variables('apiVersion')]",
"location": "[resourceGroup().location]",
"properties": {
"sku": {
"name": "Standard_v2",
"tier": "Standard_v2",
"capacity": 3
},
"sslCertificates": [
{
"name": "sslCert",
"properties": {
"data": "[parameters('certData')]",
"password": "[parameters('certPassword')]"
}
}
],
"sslPolicy": {
"policyType": "Predefined",
"policyName": "AppGwSslPolicy20220101"
},
"sslProfiles": [
{
"name": "sslnotrustedcert",
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', variables('applicationGatewayName')), '/sslProfiles/sslnotrustedcert')]",
"properties": {
"clientAuthConfiguration": {
"VerifyClientCertIssuerDN": false,
"VerifyClientRevocation": "None",
"VerifyClientAuthMode": "Passthrough"
}
}
}
],
"gatewayIPConfigurations": [
{
"name": "appGatewayIpConfig",
"properties": {
"subnet": {
"id": "[variables('subnetRef')]"
}
}
}
],
"frontendIPConfigurations": [
{
"name": "appGatewayFrontendIP",
"properties": {
"PublicIPAddress": {
"id": "[variables('publicIPRef')]"
}
}
}
],
"frontendPorts": [
{
"name": "port2",
"properties": {
"Port": 444
}
}
],
"backendAddressPools": [
{
"name": "pool2",
"properties": {
"BackendAddresses": [
{
"fqdn": "headerappgw-hsa5gjh8fpfebcfd.westus-01.azurewebsites.net"
}
]
}
}
],
"backendHttpSettingsCollection": [
{
"name": "settings2",
"properties": {
"Port": 80,
"Protocol": "Http"
}
}
],
"httpListeners": [
{
"name": "listener2",
"properties": {
"FrontendIPConfiguration": {
"Id": "[concat(variables('applicationGatewayID'), '/frontendIPConfigurations/appGatewayFrontendIP')]"
},
"FrontendPort": {
"Id": "[concat(variables('applicationGatewayID'), '/frontendPorts/port2')]"
},
"Protocol": "Https",
"SslCertificate": {
"Id": "[concat(variables('applicationGatewayID'), '/sslCertificates/sslCert')]"
},
"sslProfile": {
"id": "[concat(variables('applicationGatewayID'), '/sslProfiles/sslnotrustedcert')]"
}
}
}
],
"requestRoutingRules": [
{
"Name": "rule2",
"properties": {
"RuleType": "Basic",
"priority": 2000,
"httpListener": {
"id": "[concat(variables('applicationGatewayID'), '/httpListeners/listener2')]"
},
"backendAddressPool": {
"id": "[concat(variables('applicationGatewayID'), '/backendAddressPools/pool2')]"
},
"backendHttpSettings": {
"id": "[concat(variables('applicationGatewayID'), '/backendHttpSettingsCollection/settings2')]"
}
}
}
]
},
"dependsOn": [
"[concat('Microsoft.Network/virtualNetworks/', variables('virtualNetworkName'))]",
"[concat('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]"
]
}
]
}
Implantar o modelo
az deployment group create \
--resource-group <your-resource-group> \
--template-file deploymentTemplate.json \
--parameters @deploymentParameters.json
Validar e testar
Validar a implantação
- No portal do Azure, verifique o arquivo JSON do recurso Gateway de Aplicações.
- Selecione a API versão 2025-03-01 e verifique o sslprofile
- Validar
verifyClientAuthModeé definido como "passagem"
"sslProfiles": [
{
"name": "sslnotrustedcert",
"id": "samplesubscriptionid",
"etag": "W/\"851e4e20-d2b1-4338-9135-e0beac11aa0e\"",
"properties": {
"provisioningState": "Succeeded",
"clientAuthConfiguration": {
"verifyClientCertIssuerDN": false,
"verifyClientRevocation": "None",
"verifyClientAuthMode": "Passthrough"
},
"httpListeners": [
{
"id": "samplesubscriptionid"
}
]
Enviar o certificado do cliente para o back-end
Se você precisar encaminhar o certificado do cliente para o back-end, configure uma regra de reescrita conforme descrito em mutual-authentication-server-variables.
Se o cliente enviou um certificado, essa regravação garante que o certificado do cliente seja incluído nos cabeçalhos de solicitação para processamento de back-end.
Testar conectividade
- As conexões devem ser estabelecidas mesmo se um certificado do cliente não for fornecido.
Parâmetros de passagem do mTLS
| Nome | Tipo | Description |
|---|---|---|
| verifyClientCertIssuerDN | boolean | Verificar o nome do emissor do certificado do cliente no gateway |
| verifyClientRevocation | opções | Verificar a revogação do certificado do cliente |
| VerifyClientAuthMode | opções | Definir o modo de certificado do cliente (Strict ou Passthrough) |
Modo de passagem: O gateway solicita um certificado do cliente, mas não o impõe. O back-end valida o certificado e impõe a política.
Aviso de segurança
Essa solução é classificada como Microsoft Confidential. Certifique-se de seguir as práticas recomendadas de segurança e manipulação de dados da sua organização ao implantar e gerenciar essa solução.