Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In dieser Schnellstartanleitung wird gezeigt, wie Sie ein Azure-Anwendungsgateway mit mTLS-Passthrough (Mutual TLS) mithilfe einer ARM-Vorlage und API-Version 2025-03-01bereitstellen. Im Passthrough-Modus fordert das Gateway ein Clientzertifikat an, überprüft es jedoch nicht. Zertifikatüberprüfung und Richtlinienerzwingung erfolgen im Back-End.
Wichtigste Funktionen
- Ordnen Sie dem Listener für mTLS-Passthrough ein SSL-Profil zu.
- Es ist kein CA-Client-Zertifikat für das Gateway erforderlich.
-
verifyClientAuthModeunterstütztStrictundPassthrough.
Hinweis
Portal-, PowerShell- und CLI-Unterstützung für passthrough-Konfigurationen sind derzeit nicht verfügbar. Verwenden Sie für diesen Leitfaden ARM-Vorlagen.
Voraussetzungen
- Azure-Abonnement und -Ressourcengruppe.
- Die Azure CLI muss installiert sein.
- SSL-Zertifikat (Base64-codierte PFX) und Kennwort.
- SSH-Schlüssel für Linux-VM-Administrator (falls zutreffend).
- API-Version
2025-03-01für passthrough-Eigenschaft.
Bereitstellen des Anwendungsgateways mit mTLS-Passthrough-Listener
Diese Vorlage erstellt:
- Ein virtuelles Netzwerk mit zwei Subnetzen (eines, das an das Anwendungsgateway delegiert wurde).
- Eine öffentliche IP-Adresse für das Gateway-Frontend.
- Ein Anwendungsgateway (Standard_v2) mit:
- SSL-Zertifikat und SSL-Profil für Passthrough von Clientzertifikaten.
- HTTPS-Listener und Routingregel.
- Backend-Pool, der auf einen App-Service zeigt. Aktualisieren Sie die Vorlage mit Ihren Konfigurationsdetails, und fügen Sie ein gültiges SSL-Zertifikat ein.
Parameterdatei: 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>"
}
}
}
Vorlagendatei: 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'))]"
]
}
]
}
Implementieren der Vorlage
az deployment group create \
--resource-group <your-resource-group> \
--template-file deploymentTemplate.json \
--parameters @deploymentParameters.json
Überprüfen und Testen
Überprüfen der Bereitstellung
- Überprüfen Sie im Azure-Portal die JSON-Datei der Application Gateway-Ressource.
- Wählen Sie API-Version 2025-03-01 aus, und überprüfen Sie sslprofile.
- Validate
verifyClientAuthModeist auf "Passthrough" festgelegt.
"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"
}
]
Clientzertifikat an Back-End senden
Wenn Sie das Clientzertifikat an das Back-End weiterleiten müssen, konfigurieren Sie eine Neuschreibregel, wie in den Variablen für die gegenseitige Authentifizierung und den Server beschrieben.
Wenn der Client ein Zertifikat gesendet hat, stellt diese Neuschreibung sicher, dass das Clientzertifikat in den Anforderungsheadern für die Back-End-Verarbeitung enthalten ist.
Testen der Konnektivität
- Verbindungen sollten auch dann hergestellt werden, wenn kein Clientzertifikat bereitgestellt wird.
mTLS-Passthrough-Parameter
| Name | Typ | Description |
|---|---|---|
| verifyClientCertIssuerDN | boolean | Überprüfen des Namens des Clientzertifikatherausgebers auf dem Gateway |
| verifyClientRevocation | options | Überprüfung der Sperrung von Clientzertifikaten |
| VerifyClientAuthMode | options | Festlegen des Clientzertifikatmodus (Strict oder Passthrough) |
Passthrough-Modus: Das Gateway fordert ein Clientzertifikat an, erzwingt es jedoch nicht. Das Backend validiert das Zertifikat und erzwingt die Richtlinie.
Sicherheitshinweis
Diese Lösung wird als "Microsoft Vertraulich" klassifiziert. Stellen Sie sicher, dass Sie bei der Bereitstellung und Verwaltung dieser Lösung die bewährten Methoden für die Sicherheit und Datenverarbeitung Ihrer Organisation befolgen.