HTTP和HTTPS区别详解

文章导读
HTTP 和 HTTPS 的报文格式其实一样,请求行、请求头、状态码、响应体都没有差别,差别在于 HTTPS 把这层报文整体放进了 TLS 里再发。所以判断一条链路走的到底是哪种,不用翻代码,看连接建立阶段的握手日志就能确认:有 TLS 握手、能校验出证书链的是 HTTPS,直接 TCP 连上就开始发请求行的是 HTTP。端口号不能当判据,80 端口上跑 TLS、443 端口上跑明文,在实际环境里
📋 目录
  1. 一 HTTP和HTTPS的区别简单说
  2. 二 HTTP和HTTPS的区别及优缺点
  3. 三 HTTP和HTTPS:各自站在什么位置
  4. 四 HTTP和HTTPS:性能、成本、运维、上手四个口径分开比
  5. 五 HTTP和HTTPS:什么情况选哪一边
A A

HTTP 和 HTTPS 的报文格式其实一样,请求行、请求头、状态码、响应体都没有差别,差别在于 HTTPS 把这层报文整体放进了 TLS 里再发。所以判断一条链路走的到底是哪种,不用翻代码,看连接建立阶段的握手日志就能确认:有 TLS 握手、能校验出证书链的是 HTTPS,直接 TCP 连上就开始发请求行的是 HTTP。端口号不能当判据,80 端口上跑 TLS、443 端口上跑明文,在实际环境里都出现过。

先看握手再谈取舍。用 curl -sv 打开一条请求,输出里出现 SSL certificate verify ok 与 ALPN 协商结果,说明这条链路是 HTTPS;只有 TCP 连接和请求行,则是 HTTP。HTTPS 多出 TLS 握手与证书链校验,换来传输加密和身份确认;内网回源、本机调试可以先用 HTTP,面向公网且带登录态、表单、Cookie 的入口建议走 HTTPS。切换前先确认证书链是否完整、SNI 是否带对、HSTS 是否已经下发到浏览器,这三处最容易卡住。

HTTP和HTTPS的区别简单说

这一步对应排查里的第一个动作:确认协议。可核对的位置有三处,按方便程度排:浏览器开发者工具的 Security 面板会写明连接是否安全、用的哪个 TLS 版本;命令行用 curl -sv;再往下用 openssl s_client 看证书链。

下面这条命令把 URL 换成你要查的域名,在任意有 curl 的机器上执行,只看握手相关的行:

curl -sv -o /dev/null https://example.com 2>&1 | grep -Ei 'SSL|TLS|ALPN|subject|issuer|HTTP/'

输出里要认出三样东西:SSL certificate verify ok 表示证书链校验通过;ALPN, server accepted to use h2 表示协商到了 HTTP/2,浏览器通常只在 TLS 上启用 HTTP/2;最后一行的 HTTP/2 200 是应用层协议版本,它和 TLS 版本是两件事,不要混为一谈。证书链是否完整,用这条命令看:

openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates

-servername 不能省,同一个 IP 上挂多个站点时,不带 SNI 会拿到默认站点的证书,看着像配错了其实只是取错了对象。域名、端口、证书路径都要按实际替换。

HTTP和HTTPS的区别及优缺点

HTTPS 拿到的是三样东西:传输加密、防篡改、服务端身份确认。另外还有一个常被忽略的副作用,浏览器把 HTTPS 视为 secure context,Service Worker、地理位置、剪贴板等接口只在 secure context 下可用,SameSite=None 的 Cookie 也要求 Secure 属性。

代价也具体:证书的签发与续期要有人管,TLS 握手多一段往返,排障面多了一层(证书过期、链不全、协议版本不匹配、客户端不支持)。HTTP 的好处是抓包直观,tcpdump 或 Wireshark 直接看明文,内网回源也少一层 CPU;代价是凭据和 Cookie 明文过网,现代浏览器会在地址栏标不安全。

按这个顺序判断,基本不会走偏:

  1. 这条请求是否跨公网、是否携带登录态或表单数据;
  2. 入口是不是浏览器直接访问的页面(涉及 secure context 能力);
  3. 用 curl -sv 确认当前链路的实际协议,而不是看配置文件的意图;
  4. 看证书链是否完整、到期时间还有多久(openssl x509 -noout -dates);
  5. 最后才决定是改入口还是改回源段。

最容易踩的坑在反向代理这一层:TLS 在入口终止后,后端收到的只是 http 请求,框架据此生成的绝对 URL 和 302 跳转就会变成 http://,表现为循环重定向或浏览器报混合内容。核对位置是响应头里的 Location: 和请求头里的 X-Forwarded-Proto。nginx 侧补一行 proxy_set_header X-Forwarded-Proto $scheme;,应用侧确认信任代理的配置已打开,两处都改了才算闭环。改完用一个会返回绝对地址的接口验证 scheme 是不是 https。

HTTP和HTTPS:各自站在什么位置

HTTP 的合理位置是:内网服务之间的回源一跳、本机开发调试、公网入口后面的内网链路、纯公开且无凭据的静态镜像。它的判断口径很直接——请求不出受控网络、不带用户凭据、下游还有一层 TLS 兜着,这三点同时成立时用 HTTP 不算问题。

HTTPS 的合理位置是面向公网的用户入口,尤其是登录、支付、上传这类动作。判断口径可以查 MDN 上 Window.isSecureContext 这一页,里面列了哪些场景算 secure context,其中 localhost 被视为 secure context,所以本机用 http://localhost 调试 Service Worker 是能跑的,换到局域网 IP 就不行,这个差别常让人误判。

HTTP和HTTPS区别详解

服务端要核对参数名,nginx 的 ngx_http_ssl_module 文档页里,listen ... ssl、ssl_certificate、ssl_certificate_key、ssl_protocols 是入口参数。配置写没写对,用 nginx -T | grep -n 'listen.*ssl' 看实际加载的内容,比翻文件可靠。

HTTP和HTTPS:性能、成本、运维、上手四个口径分开比

性能。怎么量:用 curl 的时间模板把各阶段拆开。

curl -o /dev/null -s -w 'dns=%{time_namelookup} tcp=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total}\n' https://example.com/

time_appconnect 与 time_connect 的差就是 TLS 握手耗时,HTTP 请求没有这一段。把同一个地址换成 http:// 再跑一次,同机器同链路对比才有意义。注意首次连接与会话复用后的连接差别很大,多跑几次再下判断。

成本。证书侧分 DV 与商业证书,差别在有效期、审核方式和赔付条款,具体价格和有效期去签发方的定价页看,这类数字会变,以页面当时显示为准。云厂商的负载均衡如果按 HTTPS 监听计费,计价项在负载均衡的定价页上,位置在“监听器/规格”那一栏。真正的长期成本是续期和到期告警,不是签发那一笔。

运维。面板上看三处:证书到期时间、允许的 TLS 协议版本、80 端口是否强制跳 443。自建 nginx 用 nginx -T 核对;用云负载均衡就在监听器配置和证书管理页核对。HSTS 的 Strict-Transport-Security 一旦下发,浏览器会按 max-age 记住,回退到 HTTP 调试会失败,先在测试域名上用小的 max-age 观察,别一上来就加 preload。

上手。HTTP 起个服务就能访问;本地要跑 HTTPS 需要自签证书,浏览器默认会拦,可以用 mkcert 这类工具生成受本地信任的证书。内网整体切 HTTPS 还要让每个客户端信任内部 CA,这一步的工作量往往比配服务端大,先确认客户端侧怎么分发证书再动手。

HTTP和HTTPS:什么情况选哪一边

公网入口、带登录态或表单。选 HTTPS,并且 80 端口做 301 跳转。前置条件是证书链完整(中间证书要一起配)、后端能读到 X-Forwarded-Proto 生成正确链接。验证方式:curl -sv 看到证书校验通过,浏览器 Security 面板无混合内容告警,随便打开一个详情页看图片和接口地址是不是 https。

内网服务间调用、本机开发。可以先用 HTTP。前置条件是该网段不能从公网直连、不回传用户凭据、与公网入口之间有 TLS 终止。验证方式:从外网尝试直连该内网地址应当不通,并确认应用日志里这条链路确实没有携带 Cookie 或 Token 原文。

已有 HTTPS 入口、后端源站仍是 HTTP。这是常见且可接受的形态。前置条件是 TLS 在入口终止、回源段网络受控、应用正确识别代理协议头。验证方式同前:请求一个返回绝对 URL 的接口,看返回的 scheme;再看一次重定向链路,不应出现 http 与 https 之间来回跳。

反过来的情况要说清边界:已经全站 HTTPS 且下发了较长 max-age 的 HSTS,不要再为了调试把某个页面改回 HTTP,浏览器会直接拦掉,排查成本远高于收益。