Implantar um Gateway de Aplicativo do Azure com o ouvinte de passagem mTLS

Este guia de início rápido mostra como implantar uma Gateway de Aplicativo do Azure com mutual TLS (mTLS) passthrough usando um modelo de Azure Resource Manager (ARM template) e uma versão de API 2025-03-01. 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 AC do cliente é necessário no gateway.
  • A propriedade verifyClientAuthMode dá suporte aos valores Strict e Passthrough.
  • Portal de Suporte: você pode configurar a passagem do mTLS diretamente no portal do Azure.

Observação

O suporte do PowerShell e da CLI para a configuração de passthrough não está disponível no momento. Você pode configurar a passagem do mTLS usando o portal Azure ou modelos do ARM.

Configurar a passagem do mTLS usando Azure portal

Você pode configurar a passagem mTLS diretamente no portal Azure criando um perfil SSL com o método de autenticação de cliente Passthrough:

  1. Navegue até o recurso do Gateway de Aplicativo no portal do Azure.

  2. Em Configurações, selecione perfis SSL.

  3. Selecione + Adicionar para criar um novo perfil SSL.

  4. Insira um nome para seu perfil SSL.

  5. Na guia Autenticação do Cliente , selecione Passagem.

    No modo passagem, o certificado do cliente é opcional e o servidor de back-end é responsável pela autenticação do cliente.

Screenshot mostrando a caixa de diálogo Criar perfil SSL no portal Azure com Passagem selecionada para método de autenticação do cliente.

  1. Defina as configurações da Política SSL conforme necessário.
  2. Selecione Adicionar para criar o perfil SSL.
  3. Associe o perfil SSL ao ouvinte HTTPS.

Pré-requisitos

  • Uma assinatura do Azure e um grupo de recursos.
  • CLI do Azure instalado localmente.
  • Um certificado SSL (PFX codificado em Base64) e uma senha.
  • Uma chave SSH para o administrador de VM do Linux (se aplicável).
  • Versão da API 2025-03-01 ou posterior para a propriedade de passagem.

Implantar o Gateway de Aplicativo com o ouvinte de passagem mTLS

Este modelo cria os seguintes recursos:

  • 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 Aplicação (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

Execute o seguinte comando CLI do Azure para 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

  1. No portal do Azure, navegue até o recurso do Application Gateway.

  2. Selecione Exibição JSON e selecione a versão da API 2025-03-01.

  3. Verifique se verifyClientAuthMode está ajustado para Passthrough no perfil SSL:

    "sslProfiles": [
        {
            "name": "sslnotrustedcert",
            "id": "<sample-subscription-id>",
            "etag": "W/\"851e4e20-d2b1-4338-9135-e0beac11aa0e\"",
            "properties": {
                "provisioningState": "Succeeded",
                "clientAuthConfiguration": {
                    "verifyClientCertIssuerDN": false,
                    "verifyClientRevocation": "None",
                    "verifyClientAuthMode": "Passthrough"
                },
                "httpListeners": [
                    {
                        "id": "<sample-subscription-id>"
                    }
                ]
            }
        }
    ]
    

Enviar um certificado de cliente para o back-end

Se você precisar encaminhar o certificado do cliente para o back-end, configure uma regra de reescrita. Para obter mais informações, consulte Reescrever cabeçalhos HTTP e URL com o Gateway de Aplicativo.

Quando o cliente envia 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 a conectividade

Verifique se as conexões são estabelecidas mesmo quando um certificado do cliente não é fornecido.

Parâmetros de passagem do mTLS

A tabela a seguir descreve os parâmetros para a configuração de passagem do mTLS:

Nome Tipo Description
verifyClientCertIssuerDN booleano Especifica se o nome do emissor do certificado do cliente deve ser verificado no gateway.
verifyClientRevocation String Especifica o modo de verificação de revogação de certificado do cliente.
verifyClientAuthMode String Especifica o modo de certificado do cliente. Os valores válidos são Strict e Passthrough.

Modo de passagem: O gateway solicita um certificado de cliente, mas não o impõe. O back-end valida o certificado e impõe a política.

Considerações de segurança

Siga as práticas recomendadas de segurança e manipulação de dados da sua organização ao implantar e gerenciar essa solução.