数字证书系列之四 SSL/TLS 服务器证书

数字证书系列之四 SSL/TLS 服务器证书

引子

在当今互联网中,HTTPS 已成为网站安全访问的标配。而支撑 HTTPS 安全通信的核心组件之一,便是SSL/TLS 服务器证书
SSL/TLS 服务器证书是一种数字证书,用于在客户端(如浏览器)与服务器之间建立加密连接时,验证服务器的身份并启用加密通信。它基于公钥基础设施(PKI)体系,由受信任的证书颁发机构(CA)签发。

核心作用

  1. 身份验证:向客户端证明“我就是你正在访问的网站(例如www.example.com)的合法所有者”。
  2. 加密通信:为后续的 TLS 握手提供服务器的公钥,用于协商出安全的对称会话密钥,确保传输数据的机密性和完整性。

SSL/TLS 证书的工作原理

1. 非对称加密基础

SSL/TLS 证书基于非对称加密(公钥加密)技术。服务器持有一对密钥:

  • 私钥:服务器秘密保存,绝不泄露。
  • 公钥:包含在证书中,可公开分发。

记住:公钥加密,私钥解密。

2. TLS 握手与证书验证流程

以下是一个简化的 TLS 握手过程,展示了证书的参与:

服务器客户端 (浏览器)服务器客户端 (浏览器)验证证书:1. 有效期2. 域名匹配3. 签发CA是否受信任4. 证书是否被吊销双方使用预主密钥推导出相同的会话密钥握手完成,开始加密应用数据传输alt[证书验证失败][证书验证成功]ClientHello (支持的TLS版本、密码套件等)ServerHello (选定的TLS版本、密码套件)发送服务器证书链终止连接,显示安全警告从证书中提取服务器公钥生成预主密钥,用服务器公钥加密后发送用服务器私钥解密,获得预主密钥使用会话密钥加密的“Finished”消息使用会话密钥加密的“Finished”消息

SSL/TLS 证书的主要类型

按验证级别分类

类型验证内容签发速度适用场景浏览器表现
域名验证(DV)仅验证申请者对域名的控制权(如通过DNS或文件验证)。最快(几分钟)个人网站、博客、测试环境。地址栏显示锁形图标。
组织验证(OV)验证域名控制权,并验证组织(公司)的真实性和合法性。较慢(数天)企业官网、电子商务网站。地址栏显示锁形图标,点击可查看公司信息。
扩展验证(EV)进行最严格的审查,包括法律、物理和运营实体的验证。最慢(数周)金融机构、大型电商、政府网站。地址栏显示锁形图标和公司名称(绿色地址栏已逐渐取消)。

按覆盖域名数量分类

  • 单域名证书:保护一个完全限定域名(FQDN),例如www.example.com
  • 通配符证书:保护一个域名及其所有同级子域名,例如*.example.com可保护blog.example.com,api.example.com等。不保护二级域名本身(example.com,通常需要单独申请或使用多域名证书。
  • 多域名证书(SAN/UCC):一张证书保护多个不同的域名,例如example.com,example.net,shop.example.org。通过 SAN 字段实现。

如何申请与部署 SSL/TLS 证书?

申请流程概览

  1. 生成密钥对和 CSR:在服务器上生成私钥和证书签名请求(CSR)。CSR 包含了你的公钥和要绑定的域名等信息。
    # 示例:使用 OpenSSL 生成 RSA 私钥和 CSRopenssl req-new-newkeyrsa:2048-nodes-keyoutserver.key-outserver.csr-subj"/C=CN/ST=Beijing/L=Beijing/O=Example Inc./CN=www.example.com"
  2. 提交 CSR 至 CA:在 CA(如 Let‘s Encrypt, DigiCert, Sectigo)的购买或申请页面提交 CSR。
  3. 完成验证:根据证书类型(DV/OV/EV),按照 CA 的要求完成域名或组织验证。
  4. 签发与下载:验证通过后,CA 会签发证书。你将收到证书文件(通常为.crt.pem格式)和可能的中间证书。
  5. 部署到服务器:将证书文件、私钥文件以及可能的中间证书链文件配置到 Web 服务器(如 Nginx, Apache)。

自动化申请:Let‘s Encrypt 与 ACME 协议

Let‘s Encrypt 提供了免费的 DV 证书,并通过 ACME 协议实现了完全自动化的申请、验证和续期。

# 使用 Certbot 客户端自动化获取 Let‘s Encrypt 证书的示例sudocertbot--nginx-dwww.example.com-dexample.com

Certbot 会自动完成验证、获取证书并更新 Nginx 配置。

证书链与根证书

客户端(浏览器/操作系统)内置了一份受信任的根证书列表。为了安全和灵活性,CA 通常不会直接用根证书私钥签发最终的用户证书,而是签发中间证书,再用中间证书签发用户证书。

完整的证书链= 你的服务器证书 + 中间证书(可能有多级)+ 根证书(内置在客户端)。

部署时,必须将服务器证书和所有中间证书(不包括根证书)合并为一个链文件提供给服务器,否则可能导致“链不完整”的错误。

证书生命周期管理

  1. 有效期:目前主流 CA 签发的证书有效期最长为90天(如 Let‘s Encrypt)或1年。缩短有效期是为了提升安全性,减少证书被盗用的风险窗口。
  2. 续期:必须在证书过期前完成续期。自动化工具(如 Certbot)可以设置定时任务自动续期。
  3. 吊销:如果私钥泄露或不再需要该证书,应向 CA 申请吊销。吊销状态通过证书吊销列表(CRL)在线证书状态协议(OCSP)查询。

常见问题与最佳实践

常见错误

  • 证书与域名不匹配:访问的域名不在证书的 SAN 列表中。
  • 证书已过期:未及时续期。
  • 证书链不完整:服务器未发送正确的中间证书。
  • 混合内容(Mixed Content):HTTPS 页面内加载了 HTTP 资源,导致浏览器警告。
  • 使用自签名证书:自签名证书不被公共信任,仅适用于内部测试。

安全最佳实践

  1. 使用强加密算法:私钥至少 2048 位 RSA 或 256 位 ECC。证书签名算法使用 SHA-2 系列(如 SHA256)。
  2. 启用 HSTS:通过 HTTP 严格传输安全头,强制浏览器使用 HTTPS。
    # Nginx 配置示例 add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
  3. 定期轮换私钥:定期(如每年)生成新的密钥对并重新申请证书。
  4. 监控证书过期:使用监控工具告警证书过期时间(如 30 天前)。
  5. 正确配置 SSL/TLS:使用安全的协议版本(禁用 SSLv2, SSLv3,推荐 TLS 1.2/1.3)和安全的密码套件。