HTTPS、证书与 TLS 排障

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。

HTTPS 是使用 TLS(Transport Layer Security,传输层安全)保护的 HTTP。证书验证至少检查受信任的证书链、有效期、目标域名;加密连接建立不等于客户端验证了服务端身份。

1. 需要分清的概念#

概念 用途
CA(Certificate Authority,证书颁发机构) 签发证书;客户端信任根 CA,服务端通常提供叶子与中间证书
SAN(Subject Alternative Name,主题备用名称) 证书允许的域名/地址;泛域名不是任意层级都匹配
SNI(Server Name Indication,服务端名称指示) TLS 握手时告诉入口选择哪个站点的证书;早于 HTTP Host
ALPN(Application-Layer Protocol Negotiation,应用层协议协商) 协商 h2 等协议
mTLS(mutual TLS,双向 TLS) 服务端也验证客户端证书;仍需把证书身份映射到业务权限

TLS 终止后可能明文转发,也可能重新建立 TLS。逐段记录“谁验证谁的证书”,不要因外部是 HTTPS 就认定内部也加密和验证。

2. Hands-on:证书链、域名、协议分别验收#

准备 OpenSSL 3、curl、真实预发布域名和受信任的 CA bundle 文件。公共服务使用当前维护的系统/组织信任包;内部服务使用受控分发的企业 CA,不能从可疑服务器下载根证书后直接信任。

export TLS_HOST='api.staging.example.com'
export CA_BUNDLE='/替换为/approved-ca-bundle.pem'
openssl s_client -connect "$TLS_HOST:443" -servername "$TLS_HOST" -verify_hostname "$TLS_HOST" -verify_return_error -CAfile "$CA_BUNDLE" -alpn 'h2,http/1.1' -showcerts </dev/null
curl --cacert "$CA_BUNDLE" --connect-timeout 3 --max-time 10 -sS -D - -o /dev/null "https://$TLS_HOST/health/ready"

路径替换为实际只读接口。预期链验证成功、域名匹配,查看协议与证书有效期;OpenSSL 网络等待无统一总时限时,可用操作系统的超时工具包裹或 Ctrl-C 终止。OpenSSL s_client 参数。

故障注入只修改本次客户端校验目标,不改服务端:

openssl s_client -connect "$TLS_HOST:443" -servername "$TLS_HOST" -verify_hostname 'deliberately-wrong.invalid' -verify_return_error -CAfile "$CA_BUNDLE" </dev/null

预期域名验证失败;恢复第一条命令后成功。这证明不能只凭“端口通/握手输出了证书”判定通过。

3. 浏览器正常,程序失败怎么查#

  1. 对比实际连接域名、SNI、系统时间及是否经过企业代理。
  2. 对比浏览器、容器、语言运行时使用的 CA 信任库;开发机装过企业根证书,容器可能没有。
  3. 检查服务端是否漏发中间证书;部分客户端缓存中间证书,可能掩盖问题。
  4. 核对客户端证书要求与 TLS 协议能力;不要把所有握手失败都归为“证书过期”。

修复根因后用原始校验命令重测;不能用 curl -k 或关闭证书验证作为修复。mTLS 私钥只保存在受控位置,日志不打印密钥。

4. 证书更新与回退#

先在预发布验证新证书的域名、完整链、密钥匹配和受支持客户端,再通过配置来源发布;保留仍有效的旧版本供受控回退。使用新连接验收,因为旧连接可能继续使用原有会话。检查自动续期、到期告警、外部和内部两段 TLS;过期/泄露的旧证书不能作为回退目标。AWS 配置见 ALB Security。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭