Https 浅解

传统的HTTP (Hypertext Transfer Protocol) 协议在数据传输过程中是明文的,这意味着任何恶意的第三方都可以轻易地窃听、篡改或伪造通信内容,给用户隐私和数据安全带来巨大风险。

HTTPS (Hypertext Transfer Protocol Secure) 正是为了解决这些问题而诞生的。它是在HTTP的基础上,加上了 SSL (Secure Sockets Layer)TLS (Transport Layer Security) 协议,为网络通信提供加密、身份验证和数据完整性保护。其核心目标是确保用户与网站之间的通信是私密、安全和不可篡改的。

HTTPS的安全性主要由SSL/TLS协议提供。SSL/TLS协议位于应用层 (HTTP) 和传输层 (TCP) 之间,为上层应用提供加密和认证服务。

SSL/TLS 协议

SSL/TLS协议是HTTPS的核心组件,TLS是SSL的升级版本。它们提供三项基本服务:

  • **加密 (Encryption)**:确保数据在传输过程中不被窃听。通过对称加密和非对称加密结合使用,对传输的数据进行加密,即使数据被截获,没有密钥也无法解密。
  • **身份验证 (Authentication)**:确保客户端连接的是预期的服务器,防止中间人攻击。通过数字证书来验证服务器的身份。服务器也可以配置为验证客户端身份(双向认证)。
  • **数据完整性 (Data Integrity)**:确保数据在传输过程中未被篡改。通过消息认证码(MAC)或哈希函数来校验数据,保证数据在传输过程中没有被修改。

关键技术

  • **非对称加密 (Asymmetric Encryption)**:

    • 使用一对密钥——公钥 (Public Key) 和 **私钥 (Private Key)**。
    • 公钥可以公开,主要用于加密数据或验证签名;私钥必须保密,主要用于解密数据或生成签名。
    • 特点:加密和解密使用不同的密钥,公钥无法推导出私钥。
    • 主要用于在握手阶段安全地协商对称密钥和验证身份。
  • **对称加密 (Symmetric Encryption)**:

    • 使用同一把密钥进行加密和解密。
    • 特点:速度快,效率高,适用于大量数据的加密。
    • 挑战:密钥交换的安全性。在HTTPS中,对称密钥是在TLS握手过程中通过非对称加密安全协商的。
  • **数字证书 (Digital Certificate)**:

    • 由受信任的证书颁发机构 (CA, Certificate Authority) 签发。
    • 包含服务器的公钥、服务器的身份信息(如域名)、CA的数字签名、证书有效期等。
    • 用于验证服务器身份的真实性。
  • **证书颁发机构 (CA, Certificate Authority)**:

    • 负责签发、管理和撤销数字证书的权威机构。
    • 浏览器和操作系统内置了受信任的CA列表(根证书库)。
  • **哈希函数 (Hash Function)**:

    • 将任意长度的输入数据映射为固定长度的输出(哈希值或摘要)。
    • 特点:单向性(不可逆)、抗碰撞性 (collision resistance)(难以找到两个不同输入得到相同输出)。
    • 用于验证数据完整性和数字签名。

数字证书生效过程

用户访问HTTPS网站时,浏览器通过以下步骤验证证书是否有效:

  1. **证书交换 (Certificate Exchange)**:

    • 客户端发起TLS握手:当用户在浏览器中访问HTTPS网址时,浏览器会自动向目标服务器发送一个 Client Hello 消息,启动TLS/SSL握手过程。此消息包含客户端支持的TLS版本、加密套件等信息。
    • 服务器响应并返回证书链:服务器收到 Client Hello 后,会响应 Server Hello 消息(协商确认TLS版本和加密套件),并向客户端发送其服务器证书。通常情况下,服务器还会一并发送中间证书(Intermediate Certificates),共同组成**证书链 (Certificate Chain)**,将这个打包后的证书链发送给客户端。
  2. **基本验证 (Basic Validation)**:

    • 有效期检查:检查证书是否在其指定的有效期内。
    • 域名匹配:检查证书的 Subject Alternative Name (SAN) 字段(或早期的 Common Name (CN) 字段)是否与用户当前访问的域名一致。
  3. **信任链验证 (Trust Chain Validation)**:

    • 浏览器会从服务器证书开始,逐级验证证书链中的每个证书。
    • 使用上一级证书(中间证书或根证书)的公钥,验证当前证书的数字签名是否有效。
    • 如此层层向上验证,直到验证到根证书 (Root Certificate)。
    • 确认根证书:检查该根证书是否存在于操作系统或浏览器的受信任根证书库中。如果根证书受信任,则整个证书链被认为是可信的。
  4. **吊销状态检查 (Revocation Status Check)**:

    • 浏览器会检查证书是否已被签发机构吊销。主要通过以下方式:
      • **CRL (Certificate Revocation List)**:浏览器下载CA发布的证书吊销列表,检查目标证书序列号是否在列表中。
      • **OCSP (Online Certificate Status Protocol)**:浏览器实时向CA的OCSP服务器发送查询请求,获取证书的当前状态(有效、吊销或未知)。OCSP Stapling是一种优化,由服务器定期获取OCSP响应并随证书一起发送给客户端,提高效率。
  5. **技术合规性验证 (Technical Compliance Validation)**:

    • 签名算法强度:检查证书使用的签名算法(如RSA密钥长度至少2048位、ECDSA算法)是否符合当前的安全标准。强度不足的证书可能会被拒绝或收到警告。
    • **密钥用途 (Key Usage)**:检查证书的密钥用途扩展字段是否表明该证书可用于服务器身份验证(如 TLS Web Server Authentication)。
    • 扩展字段合规性:检查其他必要的扩展字段(如 Basic Constraints)是否正确配置。

生效流程示例总结

  1. 客户端发起请求:用户在浏览器输入HTTPS开头的域名并访问。
  2. 服务器返回证书:服务器将其终端实体证书 (End-entity Certificate) 以及必要的中间证书链发送给客户端。
  3. 客户端验证证书链
    • 检查终端证书是否由中间证书A签发。
    • 检查中间证书A是否由中间证书B(或根证书)签发。
    • 以此类推,直至根证书。
    • 检查根证书是否被本地操作系统或浏览器信任。
  4. 检查吊销状态:通过OCSP或CRL确认证书链中的所有证书均未被吊销。
  5. 域名匹配与有效期:确认证书中的域名与访问域名一致,且证书在有效期内。
  6. 建立加密连接:所有验证通过后,客户端信任服务器身份。随后,客户端和服务器使用非对称加密(通常利用证书中的公钥)安全地协商出一个对称密钥,之后的所有HTTP通信都将使用此对称密钥进行加密,开始安全的加密通信。

CSR, CRT, PEM 文件

在处理SSL/TLS证书时,会遇到以下常见文件类型:

  • **CSR (Certificate Signing Request - 证书签发请求)**:

    • 这是一个包含了服务器公钥、组织信息(如域名、公司名称、城市等)以及一些可选属性(如电子邮件地址)的文件。
    • 在向CA申请数字证书之前,由服务器管理员生成此文件,并将其提交给CA。
    • CA使用CSR中的信息来创建并签署数字证书。
  • **CRT (Certificate - 证书文件)**:

    • 通常指由CA颁发的数字证书本身,扩展名常为 .crt,也可能是 .cer
    • 这是一个符合 X.509标准格式的文件,包含了服务器的公钥、服务器身份信息、CA的数字签名、证书有效期、颁发者信息等。
    • 服务器将此文件(通常与中间证书一起构成证书链)配置好,以便客户端可以验证。
  • **PEM (Privacy Enhanced Mail)**:

    • 这是一种基于Base64编码的文本文件格式,用于存储和传输各种密码学相关信息,如证书、私钥、公钥、CSR等。
    • PEM文件通常以 -----BEGIN CERTIFICATE----------BEGIN PRIVATE KEY----- 等页眉开始,并以相应的 -----END ...----- 页脚结束。
    • .crt 文件和私钥文件 (如 .key) 经常以PEM格式存储。

部署 (Nginx 示例)

通常使用Web服务器(如Nginx、Apache)进行HTTPS证书的部署。以下是一个Nginx的配置示例:

首先,将您的私钥文件(例如 your_domain.key)和CA颁发的证书文件(通常是一个包含了服务器证书及所有中间证书的捆绑文件,例如 your_domain_bundle.crt)放置在Nginx可以访问的一个安全目录中(例如 /etc/nginx/ssl/)。

然后,修改Nginx的站点配置文件(通常位于 /etc/nginx/sites-available/your_domain.conf/etc/nginx/conf.d/your_domain.conf)。

server 块中,添加或修改SSL相关配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
server {
listen 443 ssl http2; # 监听 443 端口,启用 SSL 和 HTTP/2
listen [::]:443 ssl http2; # 同样为 IPv6 监听
server_name your_domain.com www.your_domain.com; # 您的域名

ssl_certificate /etc/nginx/ssl/your_domain_bundle.crt; # 指向您的服务器证书和中间证书链的合并文件
ssl_certificate_key /etc/nginx/ssl/your_domain.key; # 指向您的私钥文件

# SSL/TLS 协议版本
ssl_protocols TLSv1.2 TLSv1.3; # 推荐只启用安全的 TLS 1.2 和 TLS 1.3

# 加密套件配置
# 对于 TLS 1.2,可以指定如下的强加密套件列表
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
# TLS 1.3 的加密套件由 OpenSSL 库(Nginx 使用的)默认处理,通常包含:
# TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256, TLS_AES_128_GCM_SHA256
# 如需显式控制 TLS 1.3 ciphers, 可使用 ssl_conf_command Ciphersuites <cipher_list>;

ssl_prefer_server_ciphers off; # 对于 TLS 1.3 和 HTTP/2, 推荐设置为 off,允许客户端选择最优套件

# SSL 会话优化
ssl_session_timeout 1d; # 会话缓存超时时间
ssl_session_cache shared:SSL:10m; # 会话缓存大小 (10MB 约可存 40000 个会话)
ssl_session_tickets off; # 考虑禁用 session tickets 如果有前向保密性的严格要求或使用不当的风险

# OCSP Stapling 配置 (提高证书状态检查效率)
ssl_stapling on; # 启用 OCSP Stapling
ssl_stapling_verify on; # 验证 OCSP 响应的有效性
resolver 8.8.8.8 8.8.4.4 valid=300s; # 配置 DNS 解析器,用于 OCSP Stapling (示例为Google Public DNS)
resolver_timeout 5s;

# HSTS (HTTP Strict Transport Security) - 推荐启用,强制客户端使用HTTPS
# add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

# 其他安全头部 (可选,但推荐)
# add_header X-Frame-Options DENY;
# add_header X-Content-Type-Options nosniff;
# add_header X-XSS-Protection "1; mode=block";
# add_header Referrer-Policy "strict-origin-when-cross-origin";

# 可选:将所有 HTTP 流量重定向到 HTTPS (在另一个 server 块中配置)
# server {
# listen 80;
# listen [::]:80;
# server_name your_domain.com www.your_domain.com;
# return 301 https://$host$request_uri;
# }

location / {
# 您的网站文件根目录或反向代理配置
root /var/www/your_domain.com/html;
index index.html index.htm;
# หรือ proxy_pass http://backend_server;
}

# 其他配置...
}

  • 80 端口是 HTTP 的默认端口,443 端口是 HTTPS 的默认端口。当用户通过浏览器访问这些服务时,如果使用的是默认端口,则端口号通常会在URL中被省略,这对用户更加友好。
  • Nginx配置中的 ssl_ciphers 主要影响 TLS 1.2 及更早版本。TLS 1.3 的加密套件选择机制有所不同,通常由底层的SSL/TLS库(如OpenSSL)管理,且可选项更少、更安全。
  • 上述Nginx配置是一个基础示例,实际部署时可能需要根据具体需求和安全最佳实践进行调整(例如,HSTS, 更详细的安全头部等)。
评论

:D 一言句子获取中...