-
Notifications
You must be signed in to change notification settings - Fork 35
Description
Overview
As part of an upcoming industry-wide change, DigiCert, the Certificate Authority (CA) for Azure Container Apps Managed Certificates, is required to migrate to a new validation platform to meet multi-perspective issuance corroboration (MPIC) requirements.
While most certificates will not be impacted by this change, private container app configurations and setups may prevent certificate issuance or renewal starting August 15, 2025.
How will I be affected by the changes?
-
For most customers: No disruption. Certificate issuance and renewals will continue as expected for eligible container app configurations.
-
For impacted scenarios: Certificate requests will fail (no certificate issued) starting August 15, 2025, if your container app configuration is not supported. Existing certificates will remain valid until their expiration (up to six months after last renewal).
Impacted Scenario
You will be affected by this change if you are using managed certificates and your container app is not publicly accessible.
-
Public accessibility to your app is required. If your app is only accessible privately (e.g., requiring a client certificate for access, having an internal only environment, using private endpoints or IP restrictions), you will not be able to create or renew a managed certificate.
-
Other container app configurations or setup methods not explicitly listed here that restrict public access, such as firewalls, authentication gateways, or any custom access policies, can also impact eligibility for managed certificate issuance or renewal.
-
Action: Ensure your app is accessible from the public internet. However, if you need to limit access to your app, then you must bring your own certificate.
How to Identify Impacted Resources?
This ARG query retrieves a list of private container apps which may be impacted by this change (e.g. apps with ingress disabled, are internal only environments, are using private endpoints, or if IP restrictions are configured). It then filters for container apps which are using managed certificates. Please note, this query does not provide complete coverage of impacted scenarios as there may be additional configurations impacting public access to your app that are not included here, so a thorough review of your environment is recommended if using managed certificates. You can copy this query, paste it into Azure Resource Graph Explorer, and then click "Run query" to view the results for your environment.
Query
// Find Container Apps using custom domains and managed certificates
resources
| where tolower(type) has "microsoft.app/containerapps"
| extend ingress = properties.configuration.ingress
| where isnotempty(ingress)
| extend customDomains = ingress.customDomains
| where isnotempty(customDomains)
| mv-expand customDomain = customDomains
// Extract domain and certificate details
| extend
domainName = tostring(customDomain.name),
certificateId = tostring(customDomain.certificateId),
managedEnvId = tostring(properties.managedEnvironmentId),
ipRestrictions = ingress.ipSecurityRestrictions,
ingressJson = tostring(ingress)
// Extract Managed Environment identifiers (subscription, resource group, name)
| extend
envSubId = tostring(split(managedEnvId, '/')[2]),
envResourceGroup = tostring(split(managedEnvId, '/')[4]),
envName = tostring(split(managedEnvId, '/')[8])
// Filter custom domains with custom certs (exclude default *.azurecontainerapps.io)
| where tolower(domainName) !endswith ".azurecontainerapps.io" and isnotempty(certificateId)
// Join with Managed Certificates to get validation method
| join kind=inner (
resources
| where tolower(type) has "microsoft.app/managedenvironments/managedcertificates"
| project
certificateId = id,
certName = name,
domainValidationMethod = properties.validationMethod,
certLocation = location
) on certificateId
// Join with Managed Environments to get public network access settings
| join kind=leftouter (
resources
| where tolower(type) has "microsoft.app/managedenvironments"
| extend
envSubId = subscriptionId,
envResourceGroup = resourceGroup,
envName = name
| project
envSubId, envResourceGroup, envName,
publicNetworkAccess = tostring(properties.publicNetworkAccess)
) on
$left.envSubId == $right.envSubId and
$left.envResourceGroup == $right.envResourceGroup and
$left.envName == $right.envName
// Evaluate Ingress flags
| extend
hasIpRestrictions = isnotempty(ipRestrictions) and array_length(ipRestrictions) > 0,
isPrivateIngress = ingressJson contains '"external":false',
isEnvPublicBlocked = publicNetworkAccess == "Disabled"
// Show only apps that have IP restrictions, private ingress, or blocked public access
| where hasIpRestrictions == 1 or isPrivateIngress == 1 or isEnvPublicBlocked == 1
// Final output: show Container Apps
| project
containerAppId = id,
environmentId = strcat("/subscriptions/", envSubId, "/resourceGroups", envResourceGroup, "/providers/Microsoft.App/managedEnvironments/", envName),
containerAppName = name, containerResourceGroup=resourceGroup, envName, envResourceGroup, envSubId, domainName, certName,
certLocation, domainValidationMethod, publicNetworkAccess, hasIpRestrictions, isPrivateIngress, isEnvPublicBlocked
| order by certName asc
Questions
Please let us know on this thread if you have any additional questions or concerns. Thank you!