跳到主要内容

RFC 2818 - 基于 TLS 的 HTTP (HTTPS) - 实用示例 (Practical Examples)

实用示例 (Practical Examples)​

完整的 HTTPS 连接 (Complete HTTPS Connection)​

客户端操作:

1. 解析 URI: https://www.example.com/page.html
→ 主机名: www.example.com
→ 端口: 443 (默认)

2. TCP 连接到 www.example.com:443

3. TLS 握手:
ClientHello →
← ServerHello + Certificate
验证证书中的主机名
...握手完成...

4. 发送加密的 HTTP 请求:
GET /page.html HTTP/1.1
Host: www.example.com

5. 接收加密的 HTTP 响应:
HTTP/1.1 200 OK
Content-Length: 1234
...

6. 关闭连接:
发送 closure_alert
关闭 TCP 连接

证书验证示例 (Certificate Verification Example)​

# Python 示例 (概念性)
import ssl
import socket

# 创建 SSL 上下文
context = ssl.create_default_context()

# 连接到服务器
sock = socket.create_connection(('www.example.com', 443))
ssock = context.wrap_socket(sock, server_hostname='www.example.com')

# wrap_socket 会自动验证:
# 1. 证书链是有效的
# 2. 主机名匹配
# 3. 证书未过期

# 获取证书信息
cert = ssock.getpeercert()
print(f"Subject: {cert['subject']}")
print(f"Issuer: {cert['issuer']}")
print(f"SANs: {cert.get('subjectAltName', [])}")

常见错误处理 (Common Error Handling)​

错误 1: 证书主机名不匹配 (Certificate Hostname Mismatch)
- 证书: *.example.com
- 访问: www.different.com
→ 终止连接或警告用户

错误 2: 证书已过期 (Certificate Expired)
- Not After: 2023-12-31
- Current: 2024-01-01
→ 拒绝连接

错误 3: 自签名证书 (Self-Signed Certificate)
- 不在受信任的 CA 列表中
→ 警告用户或拒绝连接

错误 4: 证书链不完整 (Incomplete Certificate Chain)
- 缺少中间证书
→ 无法验证, 拒绝连接