Skip to content

Network Requirements

CertifyClouds runs in your Azure tenant, inside your VNet, against your Key Vaults. This page lists every network path the application needs in order to function: what it talks to outbound, what reaches it inbound, and the NSG / firewall rules you'll need.

If activation or feature calls are failing on a fresh deploy, work through this page first.


Outbound: what CertifyClouds talks to

The Container App (or Container Instance) must be able to reach the following hosts on 443/tcp. The certificate chain check also needs the CA addresses listed below, usually on 80/tcp. If your subnet has an NSG with default-deny outbound, an Azure Firewall with FQDN filtering, or a corporate egress proxy, allow these connections.

Required, core platform

FQDN Why When
license.certifyclouds.com Licence validation and version checks. At startup and regularly while running
hub.docker.com Image pull during deploy and updates. Deploy + updates
*.docker.io Docker Hub registry endpoints (auth, manifest, layers). Deploy + updates
auth.docker.io Docker Hub authentication. Deploy + updates
production.cloudflare.docker.com Docker Hub CDN where image layers are served from. Deploy + updates
login.microsoftonline.com Microsoft Entra ID token acquisition for the Managed Identity. Continuously
*.vault.azure.net Key Vault read/write for Scan and Rotation. Continuously
graph.microsoft.com App Registration listing and credential management. Required for the Rotation feature (PRO tier). Continuously when Rotation is enabled
management.azure.com Subscription and Key Vault scans, TLS endpoint discovery, access checks in Settings → Access, and Dependencies resource updates. When scanning, discovering TLS endpoints, checking access, or using Dependencies

Conditional, only required for specific features

FQDN Why When
*.azurewebsites.net, *.azure-api.net Resource updaters (App Service, API Management, etc.) used by the Dependencies feature (PRO tier). When Dependencies is in use
Public CA issuer addresses named in your Key Vault certificates Download intermediate certificates for the certificate chain check. These addresses usually use plain HTTP on 80/tcp, but may use HTTPS on 443/tcp. Turn off Check certificate chains in Settings → Advanced if you cannot allow this access. When checking CA-issued certificate chains during scans
smtp.sendgrid.net Outbound email for alerts, if SendGrid is the configured provider. If using SendGrid
Your SMTP host Outbound email if SMTP is configured. If using SMTP
events.pagerduty.com PagerDuty incident delivery for alert rules. If PagerDuty alerting is configured
secretsmanager.{region}.amazonaws.com, acm.{region}.amazonaws.com, sts.amazonaws.com AWS Secrets Manager and Certificate Manager sync targets, plus AWS credential validation. If using Multi-Cloud Sync to AWS (PRO tier)
secretmanager.googleapis.com, certificatemanager.googleapis.com, oauth2.googleapis.com GCP Secret Manager and Certificate Manager sync targets, plus service-account token exchange. If using Multi-Cloud Sync to GCP (PRO tier)
sts.googleapis.com, iamcredentials.googleapis.com Keyless sign-in to GCP: the app's Azure identity is exchanged for a short-lived Google token, so no service-account key is stored. If using keyless Multi-Cloud Sync to GCP (PRO tier)
challenges.cloudflare.com Turnstile bot-protection on the sign-in page. If Turnstile is enabled
Your SIEM endpoint Webhook-based audit forwarding under Settings → Alerts. If configured

NSG / firewall configuration

Option A: Azure Firewall with FQDN tags

Microsoft ships FQDN tags that cover many Microsoft endpoints automatically:

  • AzureKeyVault covers *.vault.azure.net
  • AzureContainerRegistry covers your ACR (only relevant if you've imported the image to a private ACR, separate from Docker Hub)

You still need to add the following manually as they are not covered by the standard FQDN tags:

  • license.certifyclouds.com
  • hub.docker.com, *.docker.io, auth.docker.io, production.cloudflare.docker.com
  • graph.microsoft.com
  • login.microsoftonline.com
  • management.azure.com
  • The public CA issuer addresses named in your certificates, usually on 80/tcp, if certificate chain checks are on

Option B: Plain NSG outbound rules

NSGs do not support FQDN filtering, so allow outbound 443/tcp to the relevant Azure service tags plus Internet for the non-Azure endpoints. Adjust subnet, NSG names, and priorities to your environment:

# Microsoft Entra ID authentication
az network nsg rule create \
  --resource-group <nsg-rg> \
  --nsg-name <nsg-name> \
  --name "Allow-AzureAD-Outbound" \
  --priority 100 \
  --direction Outbound \
  --destination-address-prefixes AzureActiveDirectory \
  --destination-port-ranges 443 \
  --access Allow --protocol Tcp

# Key Vault data plane
az network nsg rule create \
  --resource-group <nsg-rg> \
  --nsg-name <nsg-name> \
  --name "Allow-KeyVault-Outbound" \
  --priority 110 \
  --direction Outbound \
  --destination-address-prefixes AzureKeyVault \
  --destination-port-ranges 443 \
  --access Allow --protocol Tcp

# Azure Resource Manager (used by scans, TLS discovery and access checks)
az network nsg rule create \
  --resource-group <nsg-rg> \
  --nsg-name <nsg-name> \
  --name "Allow-AzureResourceManager-Outbound" \
  --priority 120 \
  --direction Outbound \
  --destination-address-prefixes AzureResourceManager \
  --destination-port-ranges 443 \
  --access Allow --protocol Tcp

# CA issuer addresses for certificate chain checks (usually plain HTTP)
# Omit this rule if Check certificate chains is off in Settings > Advanced.
az network nsg rule create \
  --resource-group <nsg-rg> \
  --nsg-name <nsg-name> \
  --name "Allow-CA-Issuers-HTTP-Outbound" \
  --priority 210 \
  --direction Outbound \
  --destination-address-prefixes Internet \
  --destination-port-ranges 80 \
  --access Allow --protocol Tcp

# Generic internet, licence server, Docker Hub, optional SendGrid, etc.
# Use Azure Firewall FQDN filtering for tighter control if needed.
az network nsg rule create \
  --resource-group <nsg-rg> \
  --nsg-name <nsg-name> \
  --name "Allow-Internet-HTTPS-Outbound" \
  --priority 200 \
  --direction Outbound \
  --destination-address-prefixes Internet \
  --destination-port-ranges 443 \
  --access Allow --protocol Tcp

Option C: Corporate egress proxy with allowlist

If outbound traffic forces through a corporate proxy with an allowlist, hand the list below to your network team:

license.certifyclouds.com
hub.docker.com
*.docker.io
auth.docker.io
production.cloudflare.docker.com
login.microsoftonline.com
*.vault.azure.net
graph.microsoft.com
*.azurewebsites.net          # Dependencies feature only
*.azure-api.net              # Dependencies feature only
management.azure.com         # Scans, TLS discovery, Settings > Access and Dependencies
# CA issuer addresses named in your certificates: allow HTTP (usually port 80)
# and HTTPS (port 443) when Check certificate chains is on
smtp.sendgrid.net            # If using SendGrid for email alerts
events.pagerduty.com         # If PagerDuty alerting is configured
secretsmanager.<region>.amazonaws.com   # If using Multi-Cloud Sync to AWS (PRO)
acm.<region>.amazonaws.com              # If using Multi-Cloud Sync to AWS (PRO)
sts.amazonaws.com                       # If using Multi-Cloud Sync to AWS (PRO)
secretmanager.googleapis.com            # If using Multi-Cloud Sync to GCP (PRO)
certificatemanager.googleapis.com       # If using Multi-Cloud Sync to GCP (PRO)
oauth2.googleapis.com                   # If using Multi-Cloud Sync to GCP (PRO)
sts.googleapis.com                      # If using keyless Multi-Cloud Sync to GCP (PRO)
iamcredentials.googleapis.com           # If using keyless Multi-Cloud Sync to GCP (PRO)
challenges.cloudflare.com    # If Turnstile is enabled

If a proxy is required, set HTTPS_PROXY and NO_PROXY environment variables on the Container App. Set HTTP_PROXY too if certificate chain checks must reach CA issuer addresses over HTTP. NO_PROXY should include your Postgres FQDN and any internal Azure endpoints you do not want proxied.


Inbound: how users reach CertifyClouds

The deploy script creates the Container Apps Environment in internal-only mode by default, no public IP. Users reach the UI through one of several patterns; see Post-Install Reachability for the full breakdown.

For patterns that involve a reverse proxy inside your VNet (Application Gateway, an internal NVA, etc.), the CAE's NSG needs an inbound rule allowing 443/tcp from the proxy's subnet:

az network nsg rule create \
  --resource-group <nsg-rg> \
  --nsg-name <cae-nsg> \
  --name "Allow-ReverseProxy-Inbound" \
  --priority 100 \
  --direction Inbound \
  --source-address-prefixes <reverse-proxy-subnet-cidr> \
  --destination-port-ranges 443 \
  --access Allow --protocol Tcp

For Azure Front Door Premium with a Private Endpoint, the inbound flow is handled by the Private Endpoint itself, no NSG rule needed.

For VPN/ExpressRoute access, allow 443/tcp from your corporate IP ranges.

Optional inbound MCP access (ENTERPRISE)

Remote Claude and ChatGPT connectors run in the provider's cloud, not in the user's browser or local network. If you enable the MCP Connector, the existing CertifyClouds hostname must be publicly reachable over trusted HTTPS for these exact paths:

Path Purpose
/.well-known/oauth-protected-resource OAuth protected-resource metadata
/.well-known/oauth-protected-resource/api/mcp Path-aware metadata alias used by some clients
/api/mcp Authenticated Streamable HTTP transport

Route all three paths to the existing CertifyClouds backend and preserve the Authorization, MCP-Protocol-Version, MCP-Session-Id, and Content-Type headers plus POST bodies. If Cloudflare Access or another browser-oriented gateway protects the deployment, exempt only these exact paths from its interactive sign-in. Do not create a broad /api/* bypass: CertifyClouds must still validate the customer Entra bearer token and policy on every MCP request.

Provider IP ranges and user agents can help diagnose edge blocks, but they can change and are not the primary authorisation boundary. See the MCP Connector guide for Entra setup, Cloudflare AI-bot troubleshooting, and the complete security model.


PostgreSQL subnet

The Postgres flexible server runs in its own delegated subnet (Microsoft.DBforPostgreSQL/flexibleServers). For normal operation it requires no outbound rules. If you enable customer-managed keys or geo-redundant backups, allow outbound to:

  • *.blob.core.windows.net (backup destination, covered by the Storage service tag)
  • login.microsoftonline.com (for CMK, covered by AzureActiveDirectory)

Diagnostic: is my egress working?

From any host inside the CAE VNet (jump VM, peered VNet, or az containerapp exec), run:

# Licence server reachable?
curl -sS -m 10 https://license.certifyclouds.com/health
# Expected: {"status":"ok",...}

# Docker Hub reachable?
curl -sS -m 10 -o /dev/null -w "%{http_code}\n" https://hub.docker.com/v2/
# Expected: 200 or 401 (auth challenge, proves connectivity)

# Microsoft Graph reachable?
curl -sS -m 10 -o /dev/null -w "%{http_code}\n" https://graph.microsoft.com/v1.0/
# Expected: 401 (auth challenge, proves connectivity)

# Microsoft Entra ID reachable?
curl -sS -m 10 -o /dev/null -w "%{http_code}\n" https://login.microsoftonline.com/common/.well-known/openid-configuration
# Expected: 200

If license.certifyclouds.com does not respond, fix that first, the rest of the troubleshooting below assumes the licence server is reachable.


Symptoms when egress is blocked

Symptom Likely cause
Container fails to start: ImagePullBackOff or ErrImagePull Docker Hub egress blocked. Image cannot be pulled.
App boots but the Licence section shows trial/expired Licence server unreachable. The app keeps working from its cached licence during the grace period; once that ends, access is blocked until the licence server can be reached.
Activation fails on a fresh deploy Licence server unreachable. Confirm with the curl test above.
Key Vault scans succeed but show 0 secrets Key Vault data-plane egress blocked, or the Managed Identity lacks Key Vault Reader role.
Rotation worker logs Insufficient privileges or AADSTS50079 Graph API blocked, login.microsoftonline.com blocked, or Graph admin consent not granted.
Key Vault scans time out Key Vault or management.azure.com egress blocked.
Email alerts never arrive SMTP host (e.g. smtp.sendgrid.net) not in the allowlist, or no provider configured in Settings → Advanced → Email.
PagerDuty incidents never open events.pagerduty.com not in the allowlist.
Sync runs fail with provider connection or timeout errors AWS (secretsmanager / acm / sts) or GCP (secretmanager / certificatemanager / oauth2, plus sts / iamcredentials for keyless sign-in) endpoints not in the allowlist.
Hosted AI client never reaches Entra sign-in MCP metadata or transport paths are private, behind an interactive Access sign-in, or blocked by the edge's bot policy.

Why the deploy script doesn't create NSG rules

Network policy belongs to your team, not to a third-party deploy script. Automated NSG changes during a vendor tool's deploy frequently violate change-control rules, and different organisations use different egress mechanisms (NSG service tags vs Azure Firewall vs corporate proxy vs forced UDR) that we cannot autodetect.

The list above is what to give your network team.