优化 HTTPS 访问速度:Nginx 配置 OCSP Stapling

编辑于:2021年12月12日
优化 HTTPS 访问速度:Nginx 配置 OCSP Stapling

前言

由于国内网络对 Let's Encrypt 域名证书的 OSCP 服务器域名进行了 DNS 污染,用户在访问网站时,请求 OSCP 服务器的过程会导致网站访问速度很慢.本文将介绍如何通过配置网站的 nginx 来预先装订 OCSP 证书,达到优化 https 访问速度的效果.

配置流程

修改 nginx 域名 conf 文件

修改域名 conf 文件,在证书信息下加入以下代码:

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/full_chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=60s ipv6=off;
resolver_timeout 5s;

full_chain.pem为完整证书链证书.
/path/to/full_chain.pem;修改为证书实际绝对路径.
由于国内 VPS 服务器访问 OCSP 服务器可能会被污染而导致失败,所以添加resolver来解决此问题.

修改完成后执行 nginx -t 检查,执行 nginx -s reload 重载 nginx 生效.
docker 环境执行 docker exec nginx nginx -t 检查,执行 docker exec nginx nginx -s reload 重载 nginx 生效.

检查生效

在客户端,例如 macOS Linux 等系统下执行以下命令检查是否生效:

openssl s_client -connect www.yourdomain.com:443 -servername www.yourdomain.com -status -tlsextdebug < /dev/null 2>&1 | grep -i "OCSP response"
# 将命令中 www.yourdomain.com 改为你的域名

未生效结果:

OCSP response: no response sent

成功生效结果:

OCSP response:
OCSP Response Data:
    OCSP Response Status: successful (0x0)
    Response Type: Basic OCSP Response

配置完成后首次检查可能会显示未生效,因为 Nginx 收到首次请求会发起异步 OCSP 请求,尝试多执行几次来查询即可.

参考示例

upstream dockername { 
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name  www.yourdomain.com;
    return 301 https://www.yourdomain.com$request_uri;
}

server {
    listen 443 ssl;
    server_name  www.yourdomain.com;
    gzip on;    

    ssl_certificate /usr/local/nginx/conf/ssl/www.yourdomain.com.crt;
    ssl_certificate_key /usr/local/nginx/conf/ssl/www.yourdomain.com.key;

    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /usr/local/nginx/conf/ssl/www.yourdomain.com.crt;
    resolver 8.8.8.8 8.8.4.4 valid=60s ipv6=off;
    resolver_timeout 5s;    

    # access_log /var/log/nginx/dockername_access.log combined;
    # error_log  /var/log/nginx/dockername_error.log;

    location / {
        proxy_redirect off;
        proxy_pass http://dockername;

        proxy_set_header  Host                $http_host;
        proxy_set_header  X-Real-IP           $remote_addr;
        proxy_set_header  X-Forwarded-Ssl     on;
        proxy_set_header  X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Proto   $scheme;
        proxy_set_header  X-Frame-Options     SAMEORIGIN;

        client_max_body_size        100m;
        client_body_buffer_size     128k;

        proxy_buffer_size           4k;
        proxy_buffers               4 32k;
        proxy_busy_buffers_size     64k;
        proxy_temp_file_write_size  64k;
    }
}

结语

如果是境外 VPS 服务器,可以无需上述代码中含有resolver的两行代码,手动删除即可.国内 VPS 可试情况修改参数中的 DNS 地址来测试是否生效.

相关推荐