跳转到主要内容

MCP 隧道

这是什么?

安全地将 Claude 连接到在您的私有网络中运行的 MCP 服务器,无需打开入站端口或将服务暴露到互联网。MCP 隧道目前处于私有测试阶段,依赖于 Cloudflare 的隧道服务。

工作原理

MCP 隧道在 Claude 和您的内部 MCP 服务器之间创建连接,传输过程中使用多层安全措施进行加密。

当 Claude 需要访问您私有网络中的 MCP 服务器时,请求通过安全隧道传输。您需要在您的一侧部署两个组件:

  • cloudflared(Cloudflare 的隧道代理)

  • MCP 网关(由 Anthropic 提供)

Cloudflared 向 Cloudflare 边缘节点发起仅出站连接。您的防火墙无需打开任何入站端口。MCP 网关终止内层 TLS,验证上游 IP 以防止 SSRF,并根据子域将每个请求路由到正确的 MCP 服务器。

连接通过三个独立层进行保护:Anthropic 和 Cloudflare 之间的外层 mTLS(带 IP 验证)、从 Anthropic 后端到您网关的端到端加密内层 TLS(设计使得 Cloudflare 无法访问 MCP 有效负载),以及每个 MCP 服务器上应用层的 OAuth 身份验证。

您部署的内容

cloudflared

Cloudflare 的隧道代理。发起仅出站连接 — 无需入站端口。

MCP 网关

Anthropic 提供的组件,用于终止内层 TLS、验证 IP 并将请求路由到您的 MCP 服务器。

关键安全属性

  • 无需入站端口。cloudflared 仅发起出站连接 — 您的防火墙保持关闭。

  • 端到端加密。流量从 Anthropic 后端到您网关的传输过程中进行加密。Cloudflare 无法读取 MCP 有效负载。

  • 深度防御。多层身份验证:mTLS、内层 TLS 和应用层 OAuth。

  • SSRF 防护。网关验证上游 IP 以帮助防止请求伪造攻击。

本指南通过 Helm(用于 Kubernetes)和 Docker Compose 提供参考部署。您负责根据您组织的安全要求调整它们。

共同责任

保持此系统安全是 Anthropic 和您的组织之间的共同责任。

Anthropic 负责:

  • 确保只有 Anthropic 可以访问隧道

  • 在连接到您的网关之前验证您的 CA 证书

  • 确保 Claude 仅向您组织拥有的隧道发送请求

您负责:

  • 遵循本文档中的指导和任何后续指导

  • 保护隧道令牌和 TLS 私钥

  • 配置您的 MCP 服务器以使用 MCP 规范中描述的 OAuth 身份验证

  • 限制对您的网关主机和 MCP 服务器的访问权限,仅限适当的人员

  • 如果您怀疑系统已被破坏,请通知 Anthropic(请参阅响应可疑泄露)

⚠️ 凭证风险。如果攻击者获得您的隧道令牌和您的任一 TLS 私钥,他们可能会冒充您的网关并读取 MCP 请求有效负载,包括 OAuth 令牌。根据您组织的安全要求保护这些凭证 — 包括文件权限、静态加密和密钥管理。


前置条件

  • 部署目标 — Kubernetes 集群(用于 Helm)或装有 Docker 和 Docker Compose 的虚拟机。

  • 隧道 API 的 Anthropic API 令牌 — 从 claude.ai → 组织设置 → 连接器 → 隧道 API 生成一个。设置使用此令牌来配置隧道并注册您的 CA 证书。网关在运行时不需要它。设置完成后撤销它。

  • 网络访问 — 根据下表的出站连接。

  • MCP 服务器 — 一个或多个在您的私有网络中运行且网关可以访问的 MCP 服务器。

网络要求

组件

目标

目的

设置(一次性)

api.anthropic.com:443

(端口 443)

隧道配置

cloudflared

Cloudflare 边缘节点,端口 7844 TCP/UDP(198.41.192.0/19、2606:4700:a0::/44)

隧道连接

MCP 网关

您的 MCP 服务器

上游流量

请参阅 Cloudflare 的隧道防火墙文档以获取权威 IP 列表。Helm 用户可以通过启用图表的 networkPolicy 值来强制执行此出口限制。


选择您的部署方法

MCP 隧道可以通过 Helm (Kubernetes) 或 Docker Compose 部署。选择适合您基础设施的方法。

⎈ Helm / Kubernetes

推荐用于大多数客户。自动化隧道配置和证书续期。将凭证存储为 Secrets。

🐳 Docker Compose

适用于单主机或虚拟机部署。


Helm / Kubernetes 部署

1. 获取图表值

下载默认值文件。它包含解释每个字段的注释。

Shell

helm show values \
oci://us-docker.pkg.dev/anthropic-public-registry/charts/mcp-tunnel \
--version 0.1.0 > values.yaml

2. 配置您的路由

编辑 values.yaml 并在 gateway.config.routes 下至少添加一个路由。每个路由将子域前缀映射到上游 MCP 服务器 URL。

3. 查看呈现的清单

使用占位符令牌呈现图表以检查 Kubernetes 资源,然后再安装。图表需要 api.token 来呈现,但 helm template 不会调用 API。

Shell

helm template mcp-tunnel \
oci://us-docker.pkg.dev/anthropic-public-registry/charts/mcp-tunnel \
--version 0.1.0 \
-n mcp-tunnel \
-f values.yaml \
--set api.token=placeholder > rendered.yaml

根据您组织的第三方清单审查实践查看 rendered.yaml。

4. 安装图表

将您的 API 令牌存储在环境变量中,然后安装。建议使用专用命名空间以实现隔离。

Shell

# Paste your API token (input is hidden)
read -rs API_TOKEN && export API_TOKEN

helm install mcp-tunnel \
oci://us-docker.pkg.dev/anthropic-public-registry/charts/mcp-tunnel \
--version 0.1.0 \
--namespace mcp-tunnel --create-namespace \
-f values.yaml \
--set api.token="$API_TOKEN"

⚠️ 重要:安装完成后撤销 API 令牌。通过 --set 传递令牌可将其保留在值文件之外,但 Helm 仍会在发布历史记录中记录它(sh.helm.release.v1.* Secrets)。Kubernetes Secrets 默认情况下不在静止时加密,因此令牌在您撤销之前仍可从集群中恢复。

5. 检索您的隧道域

设置 Job 将隧道域写入 Secret。您需要这个来在 Claude 中配置 MCP 服务器。

Shell

kubectl get secret mcp-tunnel -n mcp-tunnel \
-o jsonpath='{.data.tunnel-domain}' | base64 -d

隧道启动并运行后,连接到 Claude。

可选:启用 NetworkPolicy

在值文件中设置 networkPolicy.enabled: true 以在网络级别限制隧道 pod 的出口。使用 pod 标签选择器或 CIDR 范围为您的上游 MCP 服务器配置 networkPolicy.mcpServers。该策略已包括 cloudflared 到达 Cloudflare 边缘的出口规则。您的集群 CNI 必须支持 NetworkPolicy——请参阅值文件以获取示例。

可选:网关配置

gateway.config.* 下的字段被传递到网关的配置文件。请参阅 附录:网关配置以获取完整列表。常见调整包括 upstream.allowed_ips、log_level 和用于 https:// 路由的 upstream.tls。要挂载配置引用的其他文件(例如用于 upstream.tls.ca_file 的 CA 包),请使用 gateway.extraVolumes 和 gateway.extraVolumeMounts。

升级

始终在 helm upgrade 上指定 --version。没有它,Helm 会从注册表中拉取最新的图表版本,这可能不是您审查的版本。

对于配置更改(路由、副本、NetworkPolicy 等),不需要 API 令牌。除非您传递 api.token,否则在升级时会跳过设置 Job:

Shell

helm upgrade mcp-tunnel \
oci://us-docker.pkg.dev/anthropic-public-registry/charts/mcp-tunnel \
--version 0.1.0 \
-n mcp-tunnel \
-f values.yaml

对于隧道令牌轮换,在值文件中增加 tunnel.tokenVersion,生成新的 API 令牌,然后升级:

Shell

# Paste your API token (input is hidden)
read -rs API_TOKEN && export API_TOKEN

helm upgrade mcp-tunnel \
oci://us-docker.pkg.dev/anthropic-public-registry/charts/mcp-tunnel \
--version 0.1.0 \
-n mcp-tunnel \
-f values.yaml \
--set api.token="$API_TOKEN"

升级完成后撤销 API 令牌。

维护完整的值文件,而不是依赖 --reuse-values。Helm 深度合并映射字段,因此使用 --reuse-values 删除路由会无声地失败。

使用 helm template 与 kubectl 或 kustomize

如果您更喜欢呈现清单并自己应用它们(通过 kubectl apply 或 kustomize 覆盖),请使用外部模式(setup.enabled: false)。单独配置隧道(请参阅 附录:隧道 API)并将凭证作为由 external.tunnelTokenSecretName 和 external.serverCertSecretName 引用的预创建 Secrets 提供。如果您发布自己的证书而不是使用设置二进制文件,请参阅 附录:证书要求。

Docker Compose 部署

1. 准备部署目录

Shell

mkdir -p mcp-gateway/{config,tunnel-data}
cd mcp-gateway
sudo chown 65532:65532 tunnel-data

chown 让容器(以 UID 65532 运行)写入绑定挂载的目录。

2. 创建 docker-compose.yaml

YAML

services:
# One-time provisioning. Run with: docker compose run --rm setup
setup:
image: us-docker.pkg.dev/anthropic-public-registry/images/mcp-gateway@sha256:62ddf0897778c80997ca789189a8a0bd63df241659d661ff9d5b0e06b5ee1dcd
entrypoint: ["/setup"]
command:
- init
- --api-url=https://api.anthropic.com
- --output=dir:/data
- --token-version=1
environment:
- API_TOKEN
volumes:
- ./tunnel-data:/data
user: "65532:65532"
read_only: true
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
profiles: ["setup"]

cloudflared:
# Verify digest at https://hub.docker.com/r/cloudflare/cloudflared/tags
image: cloudflare/cloudflared@sha256:6b599ca3e974349ead3286d178da61d291961182ec3fe9c505e1dd02c8ac31b0
command: tunnel --no-autoupdate --config /etc/cloudflared/config.yaml run
environment:
- TUNNEL_TOKEN
volumes:
- ./config/cloudflared-config.yaml:/etc/cloudflared/config.yaml:ro
restart: unless-stopped
user: "65532:65532"
read_only: true
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
stop_grace_period: 30s
logging:
options:
max-size: "10m"
max-file: "3"

mcp-gateway:
image: us-docker.pkg.dev/anthropic-public-registry/images/mcp-gateway@sha256:62ddf0897778c80997ca789189a8a0bd63df241659d661ff9d5b0e06b5ee1dcd
volumes:
- ./config/mcp-gateway.yaml:/etc/mcp-gateway/config.yaml:ro
- ./tunnel-data:/data:ro
restart: unless-stopped
user: "65532:65532"
read_only: true
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
# Should match shutdown_timeout in mcp-gateway config
stop_grace_period: 30s
logging:
options:
max-size: "10m"
max-file: "3"

安全措施:非 root 执行(UID 65532)、只读文件系统、无权限提升、所有 Linux 功能已删除、按 SHA256 摘要固定镜像。

3. 配置隧道

Shell

# Paste your API token (input is hidden)
read -rs API_TOKEN && export API_TOKEN

docker compose run --rm setup

设置命令通过隧道 API 创建隧道,生成 CA 和服务器证书,向 Anthropic 注册 CA,并将所有输出写入 ./tunnel-data/。

检索您的隧道域名以进行下一步:

Shell

sudo cat tunnel-data/tunnel-domain

⚠️ 重要:继续之前请撤销 API 令牌。

4. 配置网关

创建 config/mcp-gateway.yaml:

YAML

listen_addr: ":8080"
log_level: info
shutdown_timeout: 30s

# Your tunnel domain from Step 3
tunnel_domain: abcd1234.tunnel.anthropic.com

tls:
cert_file: /data/tls.crt
key_file: /data/tls.key

routes:
# Replace with your actual MCP servers.
# With tunnel_domain set, keys are subdomain prefixes.
docs: http://docs-mcp.internal:8080
search: http://search-mcp.internal:8080

upstream:
allowed_ips:
- 10.0.0.0/8

有关所有可用字段,请参阅 附录:网关配置。

创建 config/cloudflared-config.yaml:

YAML

ingress:
- service: http://mcp-gateway:8080

5. 部署

Shell

export TUNNEL_TOKEN=$(sudo cat tunnel-data/tunnel-token)
docker compose up -d
docker compose logs -f

目录结构:

mcp-gateway/
├── docker-compose.yaml
├── config/
│ ├── cloudflared-config.yaml
│ └── mcp-gateway.yaml
└── tunnel-data/
├── tunnel-id
├── tunnel-domain
├── tunnel-token
├── token-version
├── ca.crt
├── ca.key
├── tls.crt
└── tls.key

考虑将 CA 私钥和隧道令牌移至安全存储。

对于多虚拟机部署:将 mcp-gateway/ 目录复制到每个主机。相同的隧道令牌和证书可在所有副本中使用。

隧道启动并运行后,连接到 Claude。

证书续期(Compose)

服务器证书的有效期为 90 天。在过期前续期:

Shell

docker compose run --rm setup renew-cert --output=dir:/data

网关每 30 秒轮询一次证书文件,当文件更改时自动重新加载。有关使此命令可安全地按计划运行的标志,请参阅 附录:设置 CLI 参考。

隧道令牌轮换(Compose)

编辑 docker-compose.yaml 以增加 --token-version,然后使用新的 API 令牌重新运行设置:

# Paste your API token (input is hidden)
read -rs API_TOKEN && export API_TOKEN

docker compose run --rm setup

export TUNNEL_TOKEN=$(sudo cat tunnel-data/tunnel-token)
docker compose up -d cloudflared

轮换完成后撤销 API 令牌。


连接到 Claude

隧道运行后,在 Claude 中注册您的 MCP 服务器,以便用户可以使用它们。

1. 添加 MCP 服务器

组织管理员在 claude.ai 中导航到 Organization Settings → Connectors → Add → Custom → Web。

使用隧道主机名输入每个 MCP 服务器。例如,docs.abcd1234.tunnel.anthropic.com。子域前缀与网关配置中的路由密钥匹配。

2. 用户连接

个人用户导航到 Settings → Connectors 并为他们想要使用的每个 MCP 服务器点击 Connect。

稍后添加更多服务器?向配置添加新路由,应用更改(helm upgrade 或 docker compose restart mcp-gateway),并在 Claude 中注册新主机名。无需更改证书或 cloudflared。通配符证书涵盖所有子域。

安全最佳实践

  1. 在您的 MCP 服务器上要求 OAuth。隧道和 TLS 层保护传输,但如果这些层遭到破坏,应用层的 OAuth 仍可防止未授权的工具调用。按照 MCP 规范中的说明配置每个 MCP 服务器以要求 OAuth 身份验证。

  2. 为您的 claude.ai 组织启用 SSO。隧道令牌从 claude.ai 控制台生成。启用 SSO 后,您的身份提供商的会话控制将管理管理员会话。

  3. 限制 allowed_ips。使用覆盖您的 MCP 服务器的最小 CIDR 范围。

  4. 监控日志。对警告、错误和异常模式设置警报。

  5. 轮换凭证。定期轮换证书,或在怀疑泄露时立即轮换。

  6. 保持镜像更新。及时应用网关更新。按 SHA256 摘要固定镜像。

  7. 限制网络访问。网关和 cloudflared 应仅具有所需的网络访问权限。

  8. 限制 MCP 服务器范围。MCP 服务器应仅公开必要的功能。

  9. 保护静态凭证。对 tunnel-data/ 目录(Compose)或凭证 Secret(Helm)应用适当的文件权限、静态加密和密钥管理。

应对疑似泄露

如果您怀疑您的隧道凭证、TLS 密钥或系统的其他方面已被泄露:

  1. 立即停止部署(helm uninstall 或 docker compose down --timeout 0)

  2. 从 Claude 中删除 MCP 服务器(Organization Settings → Connectors)

  3. 通过 API 存档隧道(请参阅拆卸,第 3 步)

  4. 联系 Anthropic 以便他们进行调查

  5. 轮换凭证 — 重新配置新隧道,轮换 MCP 服务器上的 OAuth 令牌

  6. 恢复服务前查看日志


故障排除

IP 验证失败

网关日志中的"IP 验证失败"表示上游解析到的 IP 不在 allowed_ips 范围内。检查已解析的 IP:

Shell

dig +short docs-mcp.internal

如果该 IP 是合法的,请更新网关配置中的 allowed_ips,以包含正确的 CIDR 范围。

隧道未连接

检查 cloudflared 日志中的错误。常见原因:

  • 隧道令牌无效

  • 防火墙阻止了到 Cloudflare 边缘的出站端口 7844 TCP/UDP

验证到 Cloudflare IP 范围的出站连接:198.41.192.0/19 和 2606:4700:a0::/44。

UDP 缓冲区大小警告

cloudflared 可能会记录 failed to sufficiently increase receive buffer size。这是一个 QUIC 传输调优问题 — 请参阅 quic-go UDP 缓冲区文档进行调整。

证书错误

如果 TLS 握手失败,请检查:

  • 服务器证书未过期(90 天有效期)

  • 证书的 SAN 与 *.<tunnel-domain> 匹配

  • CA 证书已通过 API 向 Anthropic 注册

  • 对于 Compose,证书文件可由 UID 65532 读取

通过隧道路由 OAuth(IP 允许列表后的身份验证服务器)

问题:您的身份验证服务器位于源 IP 允许列表后。Claude 的后端需要访问它以进行 OAuth 发现、客户端注册和令牌交换,但您不希望将 Anthropic 的出站 IP 范围列入白名单。

解决方案:分割端点配置。通过隧道路由后端到后端的 OAuth 调用。在现有的允许列表主机名上保留面向浏览器的 /authorize 端点。这之所以有效,是因为 Claude 从您的发现元数据中读取 authorization_endpoint,并将用户的浏览器重定向到那里。它本身不需要访问该 URL。

步骤 1:为您的身份验证服务器添加网关路由

YAML — mcp-gateway.yaml

routes:
mcp: http://your-mcp-server:8080
auth: http://your-auth-server:8080

步骤 2:提供分割端点发现元数据

您的身份验证服务器的 /.well-known/oauth-authorization-server 必须返回:

JSON

{
"issuer": "https://auth.<tunnel-id>.tunnel.anthropic.com",
"authorization_endpoint": "https://<your-allowlisted-host>/authorize",
"token_endpoint": "https://auth.<tunnel-id>.tunnel.anthropic.com/token",
"registration_endpoint": "https://auth.<tunnel-id>.tunnel.anthropic.com/register",
"code_challenge_methods_supported": ["S256"]
}

只有 authorization_endpoint 指向您现有的主机名。其他所有内容都使用隧道 URL。

步骤 3:将您的 MCP 服务器指向隧道颁发者

您的 MCP 服务器的 /.well-known/oauth-protected-resource:

JSON

{
"resource": "https://mcp.<tunnel-id>.tunnel.anthropic.com",
"authorization_servers": [
"https://auth.<tunnel-id>.tunnel.anthropic.com"
]
}


拆除

如何在不再需要隧道时将其停用。

1. 获取隧道 ID

Helm

TUNNEL_ID=$(kubectl get secret mcp-tunnel -n mcp-tunnel \
-o jsonpath='{.data.tunnel-id}' | base64 -d)

Compose

TUNNEL_ID=$(sudo cat tunnel-data/tunnel-id)

2. 停止部署

Helm:helm uninstall mcp-tunnel -n mcp-tunnel(注意:凭证 Secret 由设置 Job 创建,而不是 Helm,因此在卸载后仍然存在)
​Compose:docker compose down

3. 归档隧道

首先生成一个新的 API 令牌,完成后撤销它。

Shell

read -rs API_TOKEN && export API_TOKEN

curl -X POST "https://api.anthropic.com/v1/tunnels/${TUNNEL_ID}/archive" \
-H "Authorization: Bearer $API_TOKEN" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: mcp-tunnels-2026-02-24"

4. 删除存储的凭证

Helm:kubectl delete secret mcp-tunnel -n mcp-tunnel
​Compose:sudo rm -rf tunnel-data

获取帮助

请联系您的 Anthropic 账户团队寻求帮助。


附录:网关配置

网关从 YAML 文件读取其配置。在 Docker Compose 中,您可以直接将此文件写入 config/mcp-gateway.yaml。在 Helm 中,在您的 values 文件中的 gateway.config.* 下设置这些字段 — 图表为您管理 listen_addr、tls 和 tunnel_domain。

字段

描述

默认值

listen_addr

要监听的地址和端口

必需

log_level

日志详细程度:debug、info、warn、error

info

shutdown_timeout

优雅关闭期间等待进行中请求的时间

30s

tunnel_domain

用于前缀路由解析的基础域名

无

tls.cert_file

TLS 证书的路径

必需

tls.key_file

TLS 私钥的路径

必需

routes

主机名(或前缀)到上游 URL 的映射

必需

upstream.allowed_ips

网关可以连接的 CIDR 范围

RFC 1918 私有范围

upstream.disable_ip_validation

完全禁用 IP 验证

false

upstream.tls.ca_file

用于验证上游 TLS 的 CA 包

无

upstream.tls.include_system_cas

信任用于上游 TLS 的系统 CA 包

false

对于 https:// 路由,至少设置 upstream.tls.ca_file 或 upstream.tls.include_system_cas 之一。


附录:隧道 API

对于自定义配置工作流,您可以直接调用隧道 API。所有请求都需要这些标头:

Shell

-H "Authorization: Bearer $API_TOKEN"
-H "anthropic-version: 2023-06-01"
-H "anthropic-beta: mcp-tunnels-2026-02-24"

创建隧道:

curl -X POST https://api.anthropic.com/v1/tunnels \
-H "Authorization: Bearer $API_TOKEN" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: mcp-tunnels-2026-02-24" \
-H "Content-Type: application/json" \
-d '{}'

列出隧道:

curl https://api.anthropic.com/v1/tunnels \
-H "Authorization: Bearer $API_TOKEN" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: mcp-tunnels-2026-02-24"

注册 CA 证书:

curl -X POST "https://api.anthropic.com/v1/tunnels/${TUNNEL_ID}/certificates" \
-H "Authorization: Bearer $API_TOKEN" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: mcp-tunnels-2026-02-24" \
-H "Content-Type: application/json" \
-d "{\"ca_certificate_pem\": $(jq -Rs . < ca.crt)}"

请参阅 附录:证书要求 了解 CA 和服务器证书必须包含的内容。

列出 CA 证书:

curl "https://api.anthropic.com/v1/tunnels/${TUNNEL_ID}/certificates" \
-H "Authorization: Bearer $API_TOKEN" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: mcp-tunnels-2026-02-24"

撤销 CA 证书:

curl -X POST "https://api.anthropic.com/v1/tunnels/${TUNNEL_ID}/certificates/${CERT_ID}/revoke" \
-H "Authorization: Bearer $API_TOKEN" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: mcp-tunnels-2026-02-24"

显示隧道令牌:

curl -X POST "https://api.anthropic.com/v1/tunnels/${TUNNEL_ID}/reveal_token" \
-H "Authorization: Bearer $API_TOKEN" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: mcp-tunnels-2026-02-24"

轮换隧道令牌:

curl -X POST "https://api.anthropic.com/v1/tunnels/${TUNNEL_ID}/rotate_token" \
-H "Authorization: Bearer $API_TOKEN" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: mcp-tunnels-2026-02-24"

存档隧道:

curl -X POST "https://api.anthropic.com/v1/tunnels/${TUNNEL_ID}/archive" \
-H "Authorization: Bearer $API_TOKEN" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: mcp-tunnels-2026-02-24"


附录:证书要求

如果您使用设置二进制文件(setup init / setup renew-cert),它会自动生成符合要求的证书,您可以跳过本部分。如果您通过自己的 PKI 颁发证书,这些要求适用。

CA 证书 — 通过 POST /v1/tunnels/{id}/certificates 上传。一个隧道最多同时持有两个活跃的 CA 证书,允许无停机轮换。

  • PEM 编码,单个证书,最多 8 KB

  • BasicConstraints 扩展,包含 CA:TRUE,标记为关键

  • SubjectKeyIdentifier 扩展存在

  • KeyUsage 包含 keyCertSign

  • 在有效期内

  • RSA 2048 位或更大,或 ECDSA P-256 或更大;SHA-256 或更强的签名

服务器证书 — 由网关在内部 TLS 握手期间呈现。不上传到 Anthropic。

  • 由隧道上注册的 CA 直接签署

  • AuthorityKeyIdentifier 扩展存在,与 CA 的 SubjectKeyIdentifier 匹配

  • SAN 包含与 <route>.<tunnel-domain> 匹配的 DNS 名称(通配符 *.<tunnel-domain> 覆盖所有路由)

  • 如果存在 ExtendedKeyUsage 扩展,它包含 serverAuth

  • 在有效期内

  • RSA 2048 位或更大,或 ECDSA P-256 或更大;SHA-256 或更强的签名

参考:设置二进制文件生成 ECDSA P-256 CA(5 年有效期)和 RSA 4096 位服务器证书,带有通配符 SAN(90 天有效期)。


附录:设置 CLI 参考

setup 二进制文件通过 docker compose run --rm setup <subcommand>(Compose)或作为 Helm hook 和 CronJob(Kubernetes)在网关容器内运行。

setup init — 通过隧道 API 创建隧道,生成 CA 和服务器证书,注册 CA,并写入所有输出。

标志

描述

默认值

--api-url

Anthropic API 基础 URL。也可从 API_URL 读取。

必需

--api-token

具有隧道范围的 API 令牌。也可从 API_TOKEN 读取。

必需

--output

输出目标:dir:/path 或 k8s-secret:NAME

k8s-secret:mcp-gateway

--cert-duration

服务器证书有效期

2160h(90 天)

--token-version

变更检测字符串;新值触发隧道令牌轮换

无

setup renew-cert — 发行由存储的 CA 签署的新服务器证书。不需要 API 调用。

标志

描述

默认值

--output

输出目标:dir:/path 或 k8s-secret:NAME

k8s-secret:mcp-gateway

--cert-duration

新证书有效期

2160h(90 天)

--renew-before

如果现有证书的过期时间超过此值,则跳过

0(始终续期)

设置 --renew-before=720h 使命令在剩余超过 30 天时成为无操作,适合按计划运行。

这是否解答了您的问题?