HTTP和HTTPS有什么区别?服务器通信、安全机制与证书原理

浏览器地址栏那个小锁图标,你可能天天见,但未必想过:它到底保护了什么?为什么一个网站没配 HTTPS,Chrome 会直接标"不安全"?为什么申请证书要验证域名所有权?为什么 HTTPS 明明多了加密步骤,现代网站却几乎不比 HTTP 慢?

这篇文章从"明文 vs 加密"讲起,把 TLS 握手、对称与非对称加密的分工、数字证书和 CA 信任链、端口差异、性能开销和 HSTS 讲清楚,最后给出给站点上 HTTPS 的可执行步骤。读完你能自己判断:什么时候必须上 HTTPS、怎么选证书、怎么排查证书报错。

一、HTTP 是明文协议

HTTP(超文本传输协议)定义了浏览器和服务器之间如何请求和响应,但它本身不做任何加密。你发出的每一个请求——URL、Cookie、表单里的账号密码、Token——都以明文在网络中传输。

明文意味着三件事:中间任何一个节点(同一 Wi-Fi 下的其他人、运营商网关、代理服务器)都能看到内容,能篡改内容,也能冒充服务器。所以在公共网络里用 HTTP 登录,等于把密码写在明信片上寄出去。

HTTP 默认端口是 80。请求报文长这样:请求行(方法、路径、版本)、若干请求头、空行、可选的请求体。响应类似,包含状态码(200、404、500 等)和响应头。所有这些内容在 HTTP 下都是可读的。

二、HTTPS = HTTP + TLS

HTTPS 不是另起炉灶的新协议,而是"HTTP 跑在 TLS 之上"。它默认端口 443。HTTPS 在 TCP 连接建立后,先完成一次 TLS 握手,协商出加密密钥,之后所有 HTTP 数据都被加密传输。

TLS 提供三个安全属性:

  • 机密性:数据被加密,中间人看不到明文。
  • 完整性:数据被篡改能被检测出来。
  • 身份认证:通过证书确认"你连的服务器确实是它声称的那个"。

注意第三点最容易被忽略:加密不等于"连对了服务器"。如果攻击者用自签证书冒充某银行网站,你也建立了加密连接,但连的是假站。证书体系解决的就是"你连的是不是真的它"。

三、TLS 握手:对称和非对称加密的分工

TLS 握手的核心问题是:双方要在一条不安全的信道上,协商出一个只有彼此知道的对称密钥。它巧妙地让两种加密各司其职:

  • 非对称加密(RSA、ECDHE 等)公钥加密、私钥解密,或者用来做密钥交换。安全但慢,计算开销大。
  • 对称加密(AES、ChaCha20 等)加密和解密用同一把密钥,快得多,适合加密大量数据。

所以设计是:用非对称加密安全地交换/协商出一个对称密钥,然后用对称密钥加密后续的 HTTP 数据。这样既保证密钥交换安全,又保证数据传输高效。

以 TLS 1.2 的典型流程为例(简化):

  1. 客户端发 ClientHello:支持的 TLS 版本、加密套件、随机数。
  2. 服务端回 ServerHello:选定的版本和套件、随机数,并发送证书。
  3. 客户端验证证书(是否可信、是否过期、域名是否匹配)。
  4. 客户端用服务端公钥加密一个预主密钥发过去(RSA 密钥交换),或双方用 ECDHE 各自算出共享密钥。
  5. 双方用三个随机数/共享秘密推导出会话密钥(对称密钥)。
  6. 客户端发 Finished,服务端回 Finished,握手完成,开始用对称密钥加密通信。

TLS 1.3 把流程压缩到一次往返(1-RTT),支持 0-RTT 恢复,并移除了不安全的旧算法(如 RSA 密钥交换、RC4、SHA-1)。

# 用 openssl 观察一次 TLS 握手(-brief 看摘要,不加则看详细过程)
openssl s_client -connect example.com:443 -servername example.com -brief 

四、数字证书与 CA 信任链

证书的作用是把一个公钥和一份身份信息绑定起来,并由可信的第三方背书。第三方就是 CA(证书颁发机构)。

一张 X.509 证书里包含:域名(Subject / SAN)、公钥、有效期、颁发者、签名。浏览器预装了受信任的根 CA 列表,验证链条是:

根 CA(内置在系统/浏览器)
   └── 中间 CA(由根 CA 签)
          └── 服务器证书(由中间 CA 签,绑定了你的域名)

浏览器验证服务器证书时,会顺着链一路查上去,直到找到自己信任的根 CA,同时检查:签名有效、域名匹配、未过期、未被吊销。任意一步失败,就会弹出"证书不受信任"的警告。

证书按验证级别大致分三类:

类型 验证内容 适用场景
DV(域名验证) 只验证域名控制权 个人站、测试、内部系统
OV(组织验证) 额外验证企业身份 企业官网、一般业务
EV(扩展验证) 最严格的身份核验 金融、政务等强信任需求

从加密强度看,三类证书没有本质区别,区别在于 CA 对申请者身份的核验程度,以及证书里显示的信息。

五、HTTP 与 HTTPS 全面对比

对比项 HTTP HTTPS
加密 明文 TLS 加密
默认端口 80 443
数据完整性 无保护,可篡改 有校验,可检测篡改
身份认证 无 通过证书验证服务端身份
性能开销 无握手 多一次 TLS 握手,可会话复用
浏览器行为 标注"不安全" 显示锁图标
SEO 排名无加成 搜索引擎明确优先
证书要求 无 需要有效证书(可用免费证书)
适用场景 内网、纯静态公开信息 登录、支付、API、几乎所有公网站

六、性能开销真的很大吗

早年 HTTPS 慢,是因为 RSA 握手要做大数运算,且每个连接都要完整握手。今天情况完全不同:

  • TLS 1.3 把握手压缩到 1-RTT,恢复会话可 0-RTT。
  • 会话复用(Session ID / Session Ticket)让重复访问跳过完整握手。
  • 硬件加速:现代 CPU 内置 AES-NI 指令,对称加密几乎不占开销。
  • OCSP Stapling 减少客户端去 CA 查吊销状态的往返。

经验上,在启用了 TLS 1.3 和会话复用的前提下,HTTPS 相比 HTTP 的额外延迟通常只在首次连接时体现为一次额外往返(约一个 RTT),对用户几乎无感。真正拖慢网站的往往不是 TLS,而是没开压缩、没做 CDN、后端慢。

七、HSTS 与常见部署

HSTS(HTTP 严格传输安全)是一个响应头,告诉浏览器"以后访问我这个域名,一律用 HTTPS,别再尝试 HTTP"。它解决了"用户第一次用 http:// 访问被劫持"的问题。

# nginx 示例:强制跳转 + HSTS
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate     /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
# 安装证书工具(Let's Encrypt 免费证书常用 certbot)
# RHEL/CentOS/Rocky 8+
sudo dnf install certbot python3-certbot-nginx
# Debian/Ubuntu
sudo apt update && sudo apt install certbot python3-certbot-nginx

# 申请并自动配置证书
sudo certbot --nginx -d example.com -d www.example.com

# 测试自动续期
sudo certbot renew --dry-run

风险提示:启用 HSTS 的 max-age 一旦设得很长,回退到 HTTP 会很困难(浏览器会强制 HTTPS),首次上线建议先用较短时间(如 300 秒)验证,确认全站可用后再延长。includeSubDomains 要确保所有子域都支持 HTTPS。

八、怎么验证证书状态

# 看证书有效期和颁发者
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates -issuer -subject

# 检查证书链完整性
openssl s_client -connect example.com:443 -servername example.com -showcerts &1 | grep -i -E 'SSL|TLS|certificate'

证书报错常见原因:证书过期、域名不匹配(连了 IP 或别的域名)、中间证书缺失(链不完整,这在配置 nginx 时必须把中间证书拼进 crt 文件)、系统时间不对导致误判过期。

常见问题

Q:HTTPS 能防止网站被 DDoS 吗?
A:不能。HTTPS 保护的是传输内容的机密性和完整性,DDoS 是流量攻击,需要 CDN、WAF、限速等抗 D 手段。反过来,HTTPS 还会增加服务器 CPU 负担,理论上更容易被打满。

Q:证书一定很贵吗?
A:不一定。DV 证书有免费的(如 Let's Encrypt,90 天有效期,可自动续期),企业 OV/EV 证书通常收费,价格因 CA 而异,这里不涉及具体报价。

Q:为什么配置好后浏览器还是提示不安全?
A:多数是证书链不完整,或证书只签了 example.com 没签 www.example.com。用 openssl s_client 看证书链和 SAN 字段,按提示补齐。

Q:内网需要 HTTPS 吗?
A:看数据敏感度。内网若传输凭据、身份信息,建议上 HTTPS,可用内部 CA 签发证书,把根证书下发到终端。纯静态、无敏感数据的内网页面可暂缓。

Q:HTTP/2 和 HTTPS 什么关系?
A:主流浏览器只支持基于 TLS 的 HTTP/2(即 h2),所以上 HTTP/2 基本意味着必须先上 HTTPS。下一篇文章会详细讲。

总结

  • HTTP 是明文,端口 80,内容可被查看和篡改,无法验证服务器身份;HTTPS 是 HTTP 跑在 TLS 上,端口 443,提供机密性、完整性和身份认证。
  • TLS 握手用非对称加密安全协商出对称密钥,之后用对称加密传输数据,兼顾安全与性能;TLS 1.3 把握手压缩到 1-RTT 并支持 0-RTT。
  • 证书由 CA 签发,浏览器通过内置根 CA 验证信任链,同时检查签名、域名、有效期、吊销状态。
  • 现代 HTTPS 的性能开销很小,首次连接多一个 RTT,配合 TLS 1.3、会话复用、AES-NI 基本无感。
  • 上 HTTPS 的步骤:申请证书(DV 可免费)→ 配置 nginx/apache → 强制 301 跳转 → 加 HSTS → 自动续期。配好后用 openssl s_client 验证。