【Linux 网络基础】HTTPS 技术文档

HTTPS 技术文档

适用对象:网络/后端/安全工程师。文档涵盖 HTTPS 概述、加密原理、证书体系、TLS 握手、配置示例与常见问题,并引用相关 RFC。

目录

HTTPS 概述

  • 定义:HTTPS(Hypertext Transfer Protocol Secure)是在 HTTP 之上叠加 TLS/SSL 的安全扩展版本,通过加密、完整性校验与身份认证保护应用层通信。
  • 分层位置:TLS 位于传输层(TCP)与应用层(HTTP)之间;典型端口 443
  • HTTP vs HTTPS 对比:
    • 加密:HTTP 明文传输;HTTPS 使用对称加密(AES/ChaCha20)保护内容。
    • 完整性:HTTP 易被篡改;HTTPS 使用 AEAD(如 AES-GCM/ChaCha20-Poly1305)与序列号确保完整性。
    • 身份认证:HTTPS 通过服务器证书建立对站点的信任,支持双向认证(可选客户端证书)。
    • 协议扩展:ALPN 协商应用协议(HTTP/2、HTTP/1.1),HSTS 强制全站使用 HTTPS,SNI 支持同 IP 多证书。
    • 性能影响:握手增加往返;TLS 1.3 与会话复用/0-RTT 显著降低延迟。

加密技术原理

  • 对称加密(如 AES):同一密钥用于加/解密;HTTPS 采用 AEAD 模式(AES-GCM/ChaCha20-Poly1305)提供机密性与完整性。
  • 非对称加密(RSA/ECDSA):使用公钥/私钥对;在 HTTPS 中用于签名验证与密钥交换(TLS 1.2 可使用 RSA 密钥交换;TLS 1.3 移除 RSA 密钥交换,仅使用(EC)DHE)。
  • 混合加密体系:
    • 握手阶段使用非对称与密钥协商(DHE/ECDHE/PSK)建立会话密钥。
    • 数据传输阶段使用高效对称加密保护记录层数据。
  • 密钥交换:
    • TLS 1.2:支持 RSADHEECDHE;前向保密(PFS)依赖 DHE/ECDHE
    • TLS 1.3:仅 ECDHE/DHEPSK(会话票或外部 PSK);移除静态 RSA/DH。
  • 密钥派生:
    • TLS 1.2:master_secret = PRF(pre_master_secret, ClientRandom||ServerRandom) 并派生读写密钥与 IV。
    • TLS 1.3:基于 HKDF(RFC 5869)进行 early_secrethandshake_secretmaster_secret 逐步派生,提供更强的密钥分离与前向保密。

数字证书体系

  • 信任链:根 CA(受操作系统/浏览器信任)→ 中间 CA → 服务器证书。客户端根据信任存储验证整条链的签名与约束。
  • 关键字段(X.509,RFC 5280):
    • Subject/Issuer:主体与签发者;Serial Number:证书序列号。
    • Subject Alternative Name (SAN):域名/IP 绑定(现代浏览器以 SAN 为准)。
    • Public Key/Signature Algorithm:公钥与签名算法(RSA/ECDSA)。
    • ValidityNot Before/Not After 有效期;时间漂移会导致验证失败。
    • Key Usage/Extended Key Usage (EKU):密钥用途(digitalSignaturekeyEncipherment 等)与扩展用途(serverAuth/clientAuth)。
    • Basic Constraints:CA 标识与路径长度约束。
  • 证书验证流程:
    1. 构建证书链:服务器证书 + 中间证书(可由服务器发送/OCSP/缓存补全)。
    2. 路径验证:逐级验证签名与约束,检查根 CA 是否在信任存储中。
    3. 名称校验:使用 SAN 字段匹配访问域名(支持通配符规则)。
    4. 有效期与撤销:检查时间有效性;通过 CRL/OCSP(RFC 6960)验证撤销状态;启用 OCSP Stapling 可提升性能与可靠性。
    5. 可选客户端认证:服务器请求客户端证书并验证链/用途后建立双向认证。

SSL/TLS 握手过程

TLS 1.3 完整握手

  • 特性:握手消息更少、默认前向保密、支持 0-RTT(仅在安全评估通过情况下使用)。
  • 时序(Mermaid):

Client Server ClientHello (supported_versions, key_share, SNI, ALPN) ServerHello (key_share) 派生 handshake_secret (HKDF) EncryptedExtensions Certificate / CertificateVerify Finished 验证证书与握手完整性 Finished 派生 master_secret Application Data (加密) Client Server

  • 状态转换:InitialHandshake(密钥派生)→ AuthenticatedSecure(应用数据)。
  • 会话复用:NewSessionTicket 生成 PSK;后续 1-RTT 或 0-RTT 握手减少延迟。

TLS 1.2 完整握手

  • 时序(Mermaid):

Client Server ClientHello (版本、随机数、cipher suites、SNI、ALPN) ServerHello (选择套件) Certificate ServerKeyExchange (DHE/ECDHE) ServerHelloDone ClientKeyExchange [可选] Certificate / CertificateVerify ChangeCipherSpec / Finished ChangeCipherSpec / Finished Application Data (加密) Client Server

  • 状态转换:InitialNegotiatedKeyExchangeSecure
  • 密钥计算:pre_master_secret(RSA 或(EC)DHE)→ master_secret(PRF)→ 派生读写密钥与 IV。

配置示例

Nginx(TLS 1.2/1.3,HTTP/2,HSTS,OCSP Stapling)

nginx 复制代码
server {
  listen 443 ssl http2;
  server_name example.com;

  ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

  ssl_protocols TLSv1.2 TLSv1.3;
  # TLS 1.2 套件;TLS 1.3 套件由 OpenSSL 默认控制
  ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:
               ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:
               ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
  ssl_prefer_server_ciphers off;

  # HSTS
  add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

  # OCSP Stapling
  ssl_stapling on;
  ssl_stapling_verify on;
  resolver 1.1.1.1 8.8.8.8 valid=300s;
  resolver_timeout 5s;
  ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

  # 会话复用
  ssl_session_cache shared:SSL:50m;
  ssl_session_timeout 1d;

  location / {
    proxy_pass http://127.0.0.1:8080;
  }
}

OpenSSL 证书与调试

bash 复制代码
# 生成 ECDSA 私钥与 CSR(推荐 P-256 或使用 Ed25519 视支持情况)
openssl ecparam -name prime256v1 -genkey -noout -out server.key
openssl req -new -key server.key -out server.csr -subj '/CN=example.com'

# 使用 ACME 客户端(如 certbot)签发
# certbot certonly --nginx -d example.com

# 测试握手与证书链
openssl s_client -connect example.com:443 -servername example.com -alpn h2 -tls1_3 -showcerts

# 查看证书字段
openssl x509 -in fullchain.pem -text -noout

Curl/HTTP 客户端验证

bash 复制代码
# 验证 HTTPS 与 HTTP/2 协商
curl -I https://example.com --http2 -v

# 指定 CA 证书文件(自签场景)
curl https://internal.example --cacert /path/to/ca.crt

常见问题与排查

  • 证书不匹配:域名未在 SAN 中;修复为重新签发包含正确域名的证书。
  • 中间链缺失:服务器未发送完整链;在 ssl_certificate 提供 fullchain 或配置 ssl_trusted_certificate
  • 时间漂移:系统时间错误导致验证失败;启用 NTP 并校准时间。
  • SNI 问题:多域同 IP 未正确提供相应证书;确保客户端发送 SNI,服务器按 server_name 匹配证书。
  • 版本/套件不兼容:旧客户端不支持 TLS 1.3 或现代套件;开启 TLS 1.2 并提供兼容套件,避免启用过时算法(RC4、3DES)。
  • OCSP Stapling 失败:DNS/防火墙阻断或 ssl_trusted_certificate 未配置;检查解析与上游 OCSP 服务。
  • HTTP/2 协商失败:ALPN 未开启或证书/配置不支持;确认 http2 监听与 ALPN。
  • 混合内容:HTTPS 页面加载 HTTP 资源被浏览器阻止;统一资源为 HTTPS 或使用 CSP 约束。
  • 性能优化:开启会话复用/0-RTT(谨慎评估重放风险);优先 ECDSA 证书与 ECDHE 曲线(x25519/secp256r1)。

术语表

  • AEAD:具备同时提供加密与完整性的模式(如 AES-GCM)。
  • ALPN:应用层协议协商,选择 h2http/1.1
  • SNI:服务器名称指示,使同 IP 能托管多证书。
  • PFS:前向保密,密钥泄露不影响已完成会话,依赖(EC)DHE。
  • OCSP:在线证书状态协议,用于撤销检查;Stapling 为服务器缓存并提供结果。
  • HKDF:基于 HMAC 的密钥派生函数,TLS 1.3 的关键组成。

RFC 与参考资料

  • RFC 8446:TLS 1.3 规范
  • RFC 5246:TLS 1.2 规范
  • RFC 5280:互联网 X.509 公钥基础设施证书与 CRL
  • RFC 6066:TLS 扩展(含 SNI)
  • RFC 7301:ALPN(应用层协议协商)
  • RFC 6797:HSTS(HTTP 严格传输安全)
  • RFC 6960:OCSP(在线证书状态协议)
  • RFC 5869:HKDF(基于 HMAC 的提取与扩展密钥派生函数)

注:示例配置需结合具体 OpenSSL/Nginx 版本与平台进行适配与测试;生产环境建议使用自动化证书管理与安全基线审查,并通过 SSL Labs 等工具进行合规与性能评估。

相关推荐
写代码的学渣2 小时前
ubuntu 22.04 新装的系统 xshell 连不上
linux·运维·ubuntu
序属秋秋秋2 小时前
《Linux系统编程之进程环境》【环境变量】
linux·运维·服务器·c语言·c++·操作系统·系统编程
雲烟2 小时前
嵌入式设备EMC安规检测参考
网络·单片机·嵌入式硬件
Yue丶越3 小时前
【C语言】数据在内存中的存储
c语言·开发语言·网络
Altair12313 小时前
nginx的https的搭建
运维·网络·nginx·云计算
李宥小哥3 小时前
Redis10-原理-网络模型
开发语言·网络·php
云计算练习生3 小时前
linux shell编程实战 10 Git工具详解与运维场景实战
linux·运维·git
Umi·3 小时前
iptables的源地址伪装
运维·服务器·网络
在路上看风景3 小时前
6.4 LANS
网络