什么是 OCSP Stapling? 在 Nginx 和 Apache 上启用以加快 HTTPS

什么是 OCSP Stapling?

OCSP Stapling(在线证书状态协议装订)是一种技术,允许您的网页服务器从证书颁发机构 (CA) 预先获取 SSL 证书撤销状态,并将其直接附加到 TLS 握手中。这消除了浏览器需要向 CA 发送单独网络请求的需求,显著减少了握手延迟。

如果没有 OCSP Stapling,每次用户连接到您的 HTTPS 站点时,他们的浏览器都会联系 CA 的 OCSP 响应程序来验证证书是否被撤销。这会增加额外的 DNS 查找和往返 — 通常 50–300 毫秒(取决于 CA 的服务器位置)— 然后连接才能完全建立。

启用 OCSP Stapling 后,您的服务器会定期查询 CA,缓存签名的 OCSP 响应,并将其"装订"到每个 TLS 握手。浏览器会立即收到有效性证明,而无需联系 CA。

为什么 OCSP Stapling 很重要

没有 OCSP Stapling 的标准 TLS 握手过程如下:

  1. 浏览器发送 ClientHello
  2. 服务器响应 ServerHello + 证书
  3. 浏览器向 CA 发送 OCSP 请求(增加 50–300 毫秒延迟)
  4. CA 返回证书状态
  5. 浏览器验证并生成会话密钥
  6. 建立 HTTPS 连接

第 3–4 步正是 OCSP Stapling 消除的内容。对于面向全球受众的网站(其中 CA 服务器可能位置偏远),此开销可能会对首字节时间(TTFB)和核心网页生命值(Core Web Vitals)得分产生显著影响。

三个主要好处:(1)将 TLS 握手延迟减少 50–300 毫秒(2)保护用户隐私 — CA 不会了解哪些用户访问您的网站(3)减少 CA OCSP 响应程序的负载,提高整体服务稳定性

在 Nginx 上启用 OCSP Stapling

Nginx 自 1.3.7 版本起支持 OCSP Stapling。将以下指令添加到您的服务器块:

第 1 步 — 添加 OCSP Stapling 指令

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate     /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/ssl/certs/chain.pem;

    # DNS resolver for OCSP lookup
    resolver 8.8.8.8 1.1.1.1 valid=300s;
    resolver_timeout 5s;
}

第 2 步 — 准备证书链文件

在 ssl_trusted_certificate 中指定的文件应仅包含中间证书 + 根证书(不包含您的域证书)。大多数 SSL 提供商都包含一个名为 ca-bundle.crt 或 chain.pem 的文件,可直接在此处使用。

第 3 步 — 测试并重载 Nginx

nginx -t && systemctl reload nginx

第 4 步 — 验证 OCSP Stapling 是否活跃

openssl s_client -connect example.com:443 -status 2>/dev/null | grep -A 5 "OCSP Response"

成功的输出会显示 OCSP Response Status: successful 和 Cert Status: good。

在 Apache 上启用 OCSP Stapling

Apache 从 2.3.3 版本开始通过 mod_ssl 支持 OCSP Stapling。将这些指令添加到您的 VirtualHost 配置:

<VirtualHost *:443>
    ServerName example.com
    SSLEngine on
    SSLCertificateFile      /etc/ssl/certs/example.com.crt
    SSLCertificateKeyFile   /etc/ssl/private/example.com.key
    SSLCertificateChainFile /etc/ssl/certs/chain.pem

    # OCSP Stapling
    SSLUseStapling on
    SSLStaplingResponderTimeout 5
    SSLStaplingReturnResponderErrors off
</VirtualHost>

# Add this outside VirtualHost (global scope)
SSLStaplingCache shmcb:/run/apache2/ssl_stapling(128000)

启用 mod_ssl 并重载

a2enmod ssl
apachectl configtest && systemctl reload apache2

使用在线工具验证

除了命令行,使用这些免费工具来确认 OCSP Stapling 是否正常工作:

常见问题和解决方案

Nginx:OCSP 响应不立即显示

Nginx 在重载后的第一次真实连接时获取 OCSP 响应,而不是立即获取。发送测试请求并再次检查。还要验证 resolver 指令是否已配置 — 如果没有配置,Nginx 无法为 OCSP 响应程序执行 DNS 查找。

Apache:未定义 SSLStaplingCache

SSLStaplingCache 指令必须放在任何 VirtualHost 块的外部。将其添加到您的主 httpd.conf 或在 conf-enabled 目录中创建一个专用的 ssl-stapling.conf。

OCSP Stapling 与 Let's Encrypt 兼容吗?

可以,Let's Encrypt 完全支持 OCSP Stapling。但是,Let's Encrypt 的 OCSP 响应程序有时比商业 CA 响应程序更慢。对于需要最大 TLS 性能的网站,来自 RapidSSL 或 GeoTrust 等提供商的付费 SSL 证书提供更可预测的 OCSP 响应时间。

OCSP Stapling 和 TLS 1.3

TLS 1.3(RFC 8446)将标准握手从 2 次往返减少到 1-RTT,大大减少了连接设置时间。OCSP Stapling 在 TLS 1.3 中仍然完全受支持,通过在 TLS 1.2 中使用的相同证书状态请求扩展。要点如下:

TLS 版本 往返次数 OCSP Stapling 说明
TLS 1.2 2-RTT 支持 旧版标准
TLS 1.3 1-RTT 支持 推荐
TLS 1.3 (0-RTT) 0-RTT N/A PSK 恢复 — 不交换证书

LiteSpeed 和 Caddy 上的 OCSP Stapling

Nginx 和 Apache 不是唯一支持 OCSP Stapling 的网络服务器。两个流行的替代方案处理方式不同:

LiteSpeed Web 服务器

LiteSpeed 从版本 5.4 起自动默认启用 OCSP Stapling。不需要额外的配置。您可以在 LiteSpeed 管理控制台中的"虚拟主机"→"SSL"→"OCSP Stapling"下验证或调整设置。

Caddy

Caddy 为每个 HTTPS 网站自动启用 OCSP Stapling,包括它通过 Let's Encrypt 管理的证书。对于外部提供的证书,只需声明证书文件,Caddy 将处理装订,无需任何额外指令:

# Caddyfile — OCSP Stapling is automatic
example.com {
    tls /etc/ssl/certs/example.com.crt /etc/ssl/private/example.com.key
    root * /var/www/html
    file_server
}

不同服务器上 OCSP Stapling 配置工作量的比较:

OCSP Stapling 高级调试

如果 openssl s_client 检查未返回 OCSP 响应,请执行以下诊断步骤:

查找嵌入在证书中的 OCSP URI

openssl x509 -in /etc/ssl/certs/example.com.crt -noout -text | grep -A 3 "OCSP"

这会显示您的服务器需要访问的 OCSP 响应程序 URL(例如 http://ocsp.digicert.com)。

直接测试 OCSP 响应程序

openssl ocsp \
  -issuer /etc/ssl/certs/chain.pem \
  -cert /etc/ssl/certs/example.com.crt \
  -url http://ocsp.digicert.com \
  -text

如果输出显示 Response verify OK 和 good,则 CA 响应正确,问题出在您的服务器配置上,而不是证书上。

检查 Nginx 错误日志

tail -n 50 /var/log/nginx/error.log | grep -i ocsp

缺少或配置错误的 resolver 指令是最常见的原因。没有它,Nginx 无法执行 DNS 查找以访问 OCSP 响应程序。

检查 Apache 错误日志

grep -i "stapl" /var/log/apache2/error.log | tail -20

当 SSLStaplingCache 缺少全局范围时,Apache 会记录类似 ssl stapling_init_OCSP_cache: cache not configured 的警告。

什么是 OCSP Must-Staple?

OCSP Must-Staple 是一个可选的证书扩展,指示浏览器要求每次连接时都有一个有效的 OCSP staple。如果服务器未能提供,浏览器将拒绝连接。这提供了最强的可能的撤销执行,但要求 OCSP Stapling 始终可靠地运行。

常见问题

OCSP Stapling 与标准 OCSP 有何不同?

标准 OCSP 要求浏览器在每次连接时直接与 CA 联系,增加延迟并向 CA 泄露用户的 IP。OCSP Stapling 让服务器预先获取并缓存 CA 的响应,将其作为握手的一部分传递给浏览器 — 更快且更私密。

我应该在每个 HTTPS 网站上启用 OCSP Stapling 吗?

应该。启用 OCSP Stapling 没有任何缺点,几乎每个 HTTPS 网站都受益于减少的握手开销和改进的用户隐私。

OCSP Stapling 与 HTTP/2 一起工作吗?

OCSP Stapling 与 HTTP/2 无缝配合。由于 HTTP/2 需要 HTTPS,同时启用两者可以最大化连接设置效率和页面加载性能。

需要具有完全 OCSP Stapling 支持的 SSL 证书?

AsiaGB 提供来自 RapidSSL、GeoTrust 和 DigiCert 的 SSL 证书 — DV SSL 从 1,000 泰铢/年起,通配符 SSL 从 5,000 泰铢/年起,都支持 OCSP Stapling 和 HTTP/2。

查看所有 SSL 证书