Skip to content

Important Changes to Azure Container Apps Managed Certificates #1542

@cachai2

Description

@cachai2

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!

Metadata

Metadata

Assignees

No one assigned

    Labels

    ANNOUNCEMENTAnnouncement from the product group

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions