Repository navigation
Enterprise MCP registry unreachable on macOS: rustls rejects private CA cert (Apple -67901), fail-closed blocks all MCP #4364
Description
Activity
- addedarea:enterpriseGitHub Enterprise (GHE/GHES) support, org policies, and enterprise settingsGitHub Enterprise (GHE/GHES) support, org policies, and enterprise settingsarea:mcpMCP server configuration, discovery, connectivity, OAuth, policy, and registryMCP server configuration, discovery, connectivity, OAuth, policy, and registryarea:networkingProxy, SSL/TLS, certificates, corporate environments, and connectivity issuesProxy, SSL/TLS, certificates, corporate environments, and connectivity issues
on Aug 11, 2026 I'm encountering the same issue. Bug report by Copilot CLI below:
Enterprise MCP registry unreachable due to TLS 1.2-only server + rustls TLS 1.3 requirement → CLI fails closed and blocks all custom MCP servers
Summary
Our organization enforces
registry_access: "registry_only"via an Azure API Center-hosted MCP registry. The registry endpoint only supports TLS 1.2. Since Copilot CLI moved MCP registry validation to the native Rust HTTP client (reqwest+rustls/rustls-platform-verifier), starting around v1.0.78, the registry handshake fails outright (TLS 1.3 is required/preferred by the client), and the CLI fails closed — blocking all custom MCP servers, even ones that are correctly listed in the registry and would otherwise connect successfully.This looks like the same class of bug as #4364 (rustls being stricter than the previous Node/JS TLS stack, causing a working registry to be treated as unreachable), but triggered by TLS protocol version mismatch rather than private CA cert trust. Filing this as a related report / additional data point in case it's a distinct root cause under the same symptom.
Environment
- Copilot CLI version: 1.0.89 (also reproduced on 1.0.85–1.0.88)
- OS: macOS (Apple Silicon, arm64)
- Install method: standalone self-updating binary (
~/.local/bin/copilot), not Homebrew/npm - Org MCP registry: Azure API Center-hosted,
registry_access: "registry_only"policy (confirmed viagh api /copilot/mcp_registry) - Registry host:
<redacted>.data.<region>.azure-apicenter.ms(Azure API Center MCP registry, workspacedefault)
Steps to Reproduce
- Configure an enterprise/org Copilot policy with
registry_access: "registry_only"pointing to an Azure API Center MCP registry that only supports TLS 1.2 (no TLS 1.3 listener/cipher suite configured). - Add one or more MCP servers locally in
~/.copilot/mcp-config.jsonthat are also present in the registry (e.g. anhttp-type remote server). - Launch
copilot. - Observe the startup banner:
2 MCP servers were blocked by policy: '<server-a>', '<server-b>' - Run
/mcp show→ Online tab. Observe:Failed to load online results: Error: HTTP request failed: error sending request for url (https://<registry-host>/workspaces/default/v0.1/servers?limit=30)
Root Cause Analysis
Verified directly with
openssl s_clientagainst the registry host:$ openssl s_client -connect <registry-host>:443 -tls1_3 ... SSL alert number 40 140704... SSL routines:ssl3_read_bytes:sslv3 alert handshake failure $ openssl s_client -connect <registry-host>:443 -tls1_2 ... New, TLSv1.2, Cipher is ECDHE-RSA-AES256-GCM-SHA384 Verify return code: 0 (ok)The registry server only accepts TLS 1.2.
curlagainst the same URL succeeds (HTTP 200, valid JSON) from multiple machines/networks, becausecurl's TLS stack negotiates down to TLS 1.2 transparently. This makes the issue easy to misdiagnose as a network/proxy/DNS/RBAC problem, since manual connectivity checks all look "clean."The Copilot CLI's registry-fetch request (used both for the startup policy check and the
/mcp show→ Online tab) does not appear to negotiate down the same way, and the request fails. The CLI then fails closed, blocking all locally configured MCP servers that aren't already trusted/cached — rather than surfacing a TLS/connectivity error or failing open.Expected Behavior
- The CLI's HTTP client should support the same TLS version range as common HTTP clients (curl, browsers), i.e. negotiate TLS 1.2 when the server doesn't support 1.3, rather than hard-failing.
- If the registry truly cannot be reached, the CLI should surface a clear, actionable error (e.g. "Failed to reach MCP registry: TLS handshake failed") instead of a generic "blocked by policy" banner that gives no indication of the underlying transport failure.
- Ideally, failure to validate against the registry should not silently block servers that are otherwise configured correctly and reachable — or at minimum should be distinguishable from an explicit deny-by-policy block.
Additional Notes
- Both blocked servers in our case (
atlassian-mcp-v2-auth, a remotehttp-type server, andplaywright, a localnpx-launched server) actually connect and authenticate successfully at the transport level per session logs (Successfully authenticated with ...,Service initialized as client), despite being reported as "blocked by policy" in the startup banner. This suggests the banner/registry-check failure is somewhat decoupled from actual server connectivity, but still degrades the UX and (per/mcp show) prevents browsing the org's allowed server catalog. - We are attempting to verify whether this regression was introduced around v1.0.78 (when registry validation reportedly moved from a Node/JS-based TLS client to the native Rust/
reqwest+rustlsclient) by testing against an older CLI build; will update this issue with results. - Workaround considered: none currently available on the client side; the real fix is likely either (a) enabling TLS 1.3 on the registry endpoint (Azure API Center-side, may not be configurable by us), or (b) the CLI's HTTP client negotiating TLS 1.2 as a fallback like other clients do.
Ask
- Can the CLI's registry-fetch HTTP client be configured to allow TLS 1.2 as a fallback (matching typical HTTP client behavior), or at least surface the specific TLS error instead of a generic policy-block message?
- Is this considered the same root cause as Enterprise MCP registry unreachable on macOS: rustls rejects private CA cert (Apple -67901), fail-closed blocks all MCP #4364, or should it be tracked separately given it's a TLS protocol version issue rather than a CA trust issue?
Reacted by Julien Landuré
Describe the bug
On macOS, Copilot CLI 1.0.78 fails to validate MCP servers against an enterprise custom MCP registry because TLS verification rejects the registry's private-CA certificate with Apple error -67901 (
certificate is not standards compliant).The CLI then treats the registry as unreachable and fail-closes: all non-default / custom MCP servers are reported as blocked by policy, even though:
curl/ Nodefetchreturn HTTP 200)This looks like a regression from moving the MCP registry allowlist HTTP client into the Rust runtime (
reqwest+rustls-platform-verifier/ Apple Security.framework), which applies stricter Apple TLS rules than Node/Chrome.Affected version
Previously worked on an earlier 1.x CLI where registry allowlist verification still lived in the JS/
app.jspath (Node TLS). After 1.0.78, the same check appears in the native runtime (rustls_platform_verifier::verification::apple) and fails.Steps to reproduce
~/.copilot/mcp-config.json(or via/mcp add).--log-level debug(or run/mcp reload).Expected behavior
Actual behavior
User-facing:
Debug log (redacted host):
Telemetry kinds observed:
mcp_policy_check,mcp_allowlist_policy_check.Same host from the same machine:
curl→ TLS OK, HTTP 200 on/v0/serversand/v0.1/serversfetch→ OKCertificate details (redacted)
*.<REDACTED-INTERNAL-DOMAIN>-67901/ “not standards compliant”Additional context / analysis
Local package comparison on disk:
app.jsruntime.node, removed fromapp.jsrustls_platform_verifier(Apple)So this is not “registry down” and not (yet) an identity fingerprint mismatch (
does not match the registered server identity). The allowlist never reaches a successful registry HTTP response.Related but distinct issues: #2481 / #2498 (policy fetch 404), #3934 (identity mismatch), #4346 (403 in CI). This report is specifically TLS verification of the enterprise registry URL on macOS after the Rust migration.
Asks
rustls-platform-verifieron macOS.Happy to provide more info if needed!