Web app requires incoming client certificates
Azure App Service apps enforce mutual TLS when client certificate mode is set to Required, meaning every inbound request must present a valid client certificate that the app can validate.
Risk
Without mTLS, clients aren't cryptographically authenticated at the transport layer. Adversaries can reach endpoints using spoofed sources or stolen tokens, leading to unauthorized data access (confidentiality), request tampering (integrity), and automated abuse that degrades service (availability).
Run this check with Prowler
Run in Prowler Cloudprowler azure --checks app_client_certificates_onRecommendation
Set client certificate mode to Required and validate client certs in application logic (issuer, validity, revocation).
Enforce HTTPS only, avoid broad exclusion paths, and manage certs via a trusted CA with rotation and revocation. Apply least privilege and zero trust, layering with private access or IP restrictions as needed.
Remediation
CLI
az webapp update --resource-group <RESOURCE_GROUP_NAME> --name <APP_NAME> --set clientCertEnabled=true clientCertMode=RequiredTerraform
# Require client certificates for the App Service (use azurerm_linux_web_app or azurerm_windows_web_app)
resource "azurerm_linux_web_app" "<example_resource_name>" {
name = "<example_resource_name>"
location = "<example_location>"
resource_group_name = "<example_resource_name>"
service_plan_id = "<example_resource_id>"
client_certificate_enabled = true # Critical: enables mutual TLS
client_certificate_mode = "Required" # Critical: enforces client certs (passes the check)
site_config {}
}NativeIaC
// Require client certificates for the web app
resource appService 'Microsoft.Web/sites@2022-03-01' = {
name: '<example_resource_name>'
location: '<example_location>'
properties: {
serverFarmId: '<example_resource_id>'
clientCertEnabled: true // Critical: enables mutual TLS
clientCertMode: 'Required' // Critical: enforces client certs (passes the check)
}
}Other
Check Code
from prowler.lib.check.models import Check, Check_Report_Azure
from prowler.providers.azure.services.app.app_client import app_client
class app_client_certificates_on(Check):
def execute(self) -> Check_Report_Azure:
findings = []
for (
subscription_id,
apps,
) in app_client.apps.items():
subscription_name = app_client.subscriptions.get(
subscription_id, subscription_id
)
for app in apps.values():
report = Check_Report_Azure(metadata=self.metadata(), resource=app)
report.subscription = subscription_id
report.status = "PASS"
report.status_extended = f"Clients are required to present a certificate for app '{app.name}' in subscription '{subscription_name} ({subscription_id})'."
if app.client_cert_mode != "Required":
report.status = "FAIL"
report.status_extended = f"Clients are not required to present a certificate for app '{app.name}' in subscription '{subscription_name} ({subscription_id})'."
findings.append(report)
return findings