前几天将博客迁移到了甲骨文的 vps 上,顺便将 nginx 版本升级到了 1.25.4 ,OpenSSL 版本升级到了 3.0.2 , 迁移完后运行 nginx -t 出现如下提示。

Bash
root@blog:~# nginx -t
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/nginx/ssl/hicairo.com.pem"
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

出现一行警告信息,虽然忽略该提示也可以正常工作,不影响使用,但是作为技术控的你,总感觉心里不舒服,要把这个事情搞明白。于是就看到了这篇文章。^_^

一、相关原理:OCSP 与 CRL

出于某些原因,证书颁发者有时候需要作废某些证书。那么证书使用者(例如浏览器)如何知道一个证书是否已被作废呢?通常有两种方式:CRL(Certificate Revocation List,证书撤销名单)和 OCSP(Online Certificate Status Protocol,在线证书状态协议)。

CRL 是由证书颁发机构定期更新的一个列表,包含了所有已被作废的证书,浏览器可以定期下载这个列表用于验证证书合法性。不难想象,CRL 会随着时间推移变得越来越大,而且实时性很难得到保证。

OCSP 则是一个在线查询接口,浏览器可以实时查询单个证书的合法性。在每个证书的详细信息中,都可以找到对应颁发机构的 CRL 和 OCSP 地址。

OCSP 的问题在于,某些客户端会在 TLS 握手阶段进一步协商时,实时查询 OCSP 接口,并在获得结果前阻塞后续流程,这对性能影响很大。而 OCSP Stapling(OCSP 封套),是指服务端在证书链中包含颁发机构对证书的 OCSP 查询结果,从而让浏览器跳过自己去验证的过程。服务端有更快的网络,获取 OCSP 响应更容易,也可以将 OCSP 响应缓存起来。OCSP 响应本身经过了数字签名,无法伪造,所以 OCSP Stapling 技术既提高了握手效率,也不会影响安全性。

二、启用 OCSP

如下所示,为了解决上述问题,我们会在 Nginx 配置中 SSL 段内加入 ssl_stapling 和 ssl_stapling_verify 指令。

Bash
    server {
        ......
        ssl_stapling on;
        ssl_stapling_verify on;
        ......
    }

正常情况下,当我们运行 nginx -t 会出现如下提示。

Bash
root@blog:~# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

但是却出现了本文开始提到的警告信息。

三、原因分析

CloudFlare 为用户提供的源服务器证书是由 Cloudflare 签名的免费 TLS 证书,该域名证书属于泛域名证书,最长支持 15 年,主要用于源服务器和 Cloudflare 之间的流量加密。但是这个证书属于自签名证书,证书链不完整,缺少根证书。因此也就出现了本文开始提到的警告信息。

四、解决方法

1、使用如下网址下载 CloudFlare 的根证书/证书链文件,并上传到您的源 Web 服务器。请注意, CloudFlare 提供了 ECC 和 RSA 版本两个文件,具体下载哪一个参考上图,根据自己申请源服务器证书时选择的“私钥类型”来决定。

https://developers.cloudflare.com/ssl/origin-configuration/origin-ca/#cloudflare-origin-ca-root-certificate

2、参考如下配置,修改 nginx 中 SSL 的相关配置,增加 ssl_trusted_certificate 一行,指向上一步你上传到服务器上的根证书/证书链文件。

Bash
    server {
        ......
        ssl_stapling on;
        ssl_stapling_verify on;
        ssl_session_tickets off;
        ssl_trusted_certificate /etc/nginx/ssl/origin_ca_rsa_root.pem;
        ssl_certificate /etc/nginx/ssl/hicairo.com.pem;
        ssl_certificate_key /etc/nginx/ssl/hicairo.com.key;
        ......
    }
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。