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. 浏览器正常,程序失败怎么查#
- 对比实际连接域名、SNI、系统时间及是否经过企业代理。
- 对比浏览器、容器、语言运行时使用的 CA 信任库;开发机装过企业根证书,容器可能没有。
- 检查服务端是否漏发中间证书;部分客户端缓存中间证书,可能掩盖问题。
- 核对客户端证书要求与 TLS 协议能力;不要把所有握手失败都归为“证书过期”。
修复根因后用原始校验命令重测;不能用 curl -k 或关闭证书验证作为修复。mTLS 私钥只保存在受控位置,日志不打印密钥。
4. 证书更新与回退#
先在预发布验证新证书的域名、完整链、密钥匹配和受支持客户端,再通过配置来源发布;保留仍有效的旧版本供受控回退。使用新连接验收,因为旧连接可能继续使用原有会话。检查自动续期、到期告警、外部和内部两段 TLS;过期/泄露的旧证书不能作为回退目标。AWS 配置见 ALB Security。