静态证书
最直接方式是显式配置证书文件:*.example.com)。当没有命中任何 SNI 时,certificates 数组第一项会作为默认证书。
证书文件在启动时读取,在热更新(SIGHUP 或文件变更)时会重新读取。
ACME:自动证书管理
Arc 可以从 Let’s Encrypt 或其他兼容 ACME 的 CA 自动签发并续期证书。TLS-ALPN-01(推荐)
挑战和签发都走 HTTPS 监听器本身,不依赖 HTTP 端口或 DNS 写入:HTTP-01
需要一个 80 端口的 HTTP 监听器:DNS-01
支持 Cloudflare、Route53、RFC2136、webhook 和外部命令: Cloudflare:账号密钥配置
ACME 账号密钥会加密存储在磁盘,Arc 可从环境变量或文件读取解密口令:TLS 版本与密码套件控制
上游 mTLS
在上游定义中增加tls 块即可启用双向 TLS:
tls 后,Arc 在每次创建新上游连接时都会执行 TLS 握手;若同时配置 client_cert_pem 与 client_key_pem,会携带客户端证书完成 mTLS。
基于 SNI 的证书选择
Arc 根据 ClientHello 里的 SNI 扩展选择证书,顺序为:- 精确匹配(
example.com) - 通配匹配(
*.example.com) - 默认证书(数组第一项)
证书续期
Arc 会跟踪证书过期时间,在renew_before(默认 30 天)窗口前自动续期。续期流程:
- 向 ACME CA 发起流程并完成挑战
- 新证书通过
ArcSwap原子激活 - 已建立 TLS 连接继续使用旧证书直到断开
- 新建连接立即使用新证书
故障排查
域名没有返回正确证书
域名没有返回正确证书
请确认
certificates 中的 sni 与目标主机名精确匹配,或使用正确的通配符格式(*.example.com)。若无匹配,数组第一张证书会兜底。可用 openssl s_client -connect localhost:8443 -servername example.com 检查实际返回证书。ACME challenge 校验失败
ACME challenge 校验失败
TLS-ALPN-01 需要 443 对公网可达,且
acme.challenge.listener 要与实际 TLS 监听器 name 一致。HTTP-01 需要 80 端口 HTTP 监听。DNS-01 需要正确的 DNS 提供商凭据和可达权威 DNS。ACME 错误会写入 kind: "system" 日志。证书没有自动续期
证书没有自动续期
只有在接近
renew_before(默认 720h)窗口时才会触发续期。如果证书还“足够新”,不会执行续期。可查看 /metrics 中 arc_tls_cert_expiry_seconds。若确实超期未续,重点排查 challenge 可达性。TLS handshake error: no certificates configured
TLS handshake error: no certificates configured
说明监听器
kind 是 https/h3,但既没配置 tls.certificates 也没配置 tls.acme。请至少配置其一。上游 mTLS 报 certificate verify failed
上游 mTLS 报 certificate verify failed
确认
tls.ca_pem 指向正确 CA 证书链。如果上游是自签证书,开发环境可临时使用 tls.insecure: true,生产环境不建议这么做。
