HTTPS 不是一种新协议
HTTPS = HTTP + TLS。TLS 在传输层把内容加密,上层还是普通 HTTP。所以「用了 HTTPS 就安全」只对一半:它防的是传输途中被窃听和篡改,不解决服务端本身是否可信。
证书验证在验证什么
- 身份:证书由 CA 签发,浏览器核对域名是否匹配、签发机构是否受信任;
- 完整性:握手协商的密钥用于加密,中途数据被改会立刻失败;
- 时效:证书有有效期,过期必须续签。
常见误解
- 自签名证书不等于不安全:加密强度一样,只是没有可信 CA 背书,浏览器会警告;
- TLS 1.0 / 1.1 已淘汰:至少用 1.2,优先 1.3;
- 内网也要 HTTPS:内网流量同样可能被嗅探或中间人。
实战案例:三种“证书没问题却打不开”
- 证书链不完整:只在服务器装了站点证书、没带中间证书。桌面浏览器能靠补链打开,但部分安卓与命令行客户端报
unable to get local issuer certificate。修复:部署时带上完整链。 - 证书过期:自动续签失败不会立刻报警,直到用户看到警告。把到期时间纳入监控并在到期前 30 天告警,同时给续签加失败重试。
- 混合内容:页面已是 HTTPS,却仍引用
http://的图片或脚本,浏览器会拦截或降级提示。用 CSP 的upgrade-insecure-requests先兜底,再从源头改掉硬编码的 http 链接。
常见问题(FAQ)
HTTPS 能防重放攻击吗?不能单独防,TLS 只保证传输机密与完整;防重放要靠 nonce、时间戳或幂等令牌。运营商能看到我访问了哪个网站吗?能看到域名或 SNI(除非用 ECH),看不到具体路径与内容。HSTS 有什么用?告诉浏览器以后只用 HTTPS 访问该域,避免首次被降级劫持;上线前确认全站已支持 HTTPS。自签证书能上生产吗?只在受控内网或测试环境可行,并需把根证书预置到客户端,否则用户会看到警告。
动手试试
对称加密示例:对称加密、Base64 编解码。
部署与运维中的常见动作
理解了原理之后,日常工作中真正需要反复执行的其实是几件具体的事。
- 证书全生命周期管理:把签发、续签与到期时间纳入监控。自动续签不是配好就万事大吉,续签失败往往静默发生,直到用户看到警告。建议在到期前三十天开始告警,并对续签失败设置重试与人工兜底。
- 协议版本与加密套件策略:明确允许的协议版本与加密套件,禁用已知不安全的组合。策略要写进配置并纳入代码评审,而不是依赖运维人员每次手改。
- 安全响应头配套:启用强制跳转与预加载声明后,浏览器会长期只走加密访问,因此必须确认所有子域都已支持,否则测试环境或旧服务会立刻变得不可访问。
- 监控与告警:对握手失败率、证书剩余有效期与协议分布设监控。协议分布能反映客户端构成,握手失败率突然上升通常意味着证书或中间设备出了问题。
- 内网同样需要:内部服务之间的流量同样可能被嗅探,尤其在容器网络与跨机房链路上。逐步为内部通信启用加密,并为内部服务签发可信证书,避免用“自签加跳过校验”的方式长期将就。
与应用层的分工
需要强调的是,传输层加密只保证数据在路上的安全,不能替代应用层的鉴权、输入校验与权限控制。把“已经上了加密”当成安全已经到位的结论,是最常见的认知误区之一。