如何在 Apache 和 Nginx 上配置 OCSP Stapling

介绍

OCSP stapling 是一种 TLS/SSL 扩展,旨在提高 SSL 协商的性能,同时维护访问者的隐私。在继续进行配置之前,先简要介绍一下证书吊销的工作原理。本文使用StartSSL 颁发的免费证书进行演示。

 

关于 OCSP

OCSP(在线证书状态协议)是一种用于检查 SSL 证书是否已被吊销的协议。它是作为 CRL 的替代品创建的,以减少 SSL 协商时间。使用 CRL(证书撤销列表),浏览器会下载已撤销证书序列号的列表并验证当前证书,这会增加 SSL 协商时间。在 OCSP 中,浏览器向 OCSP URL 发送请求并接收包含证书有效性状态的响应。以下屏幕截图显示了digitalocean.com的 OCSP URI 。

OCSP URI

关于 OCSP 装订

OCSP 有两个主要问题:隐私和 CA 服务器的负载过重。

由于 OCSP 要求浏览器联系 CA 以确认证书有效性,因此它会损害隐私。CA 知道正在访问哪个网站以及谁访问了它。

如果 HTTPS 网站获得大量访问者,则 CA 的 OCSP 服务器必须处理访问者发出的所有 OCSP 请求。

当实施 OCSP 装订时,证书持有者(读取 Web 服务器)自己查询 OCSP 服务器并缓存响应。此响应通过证书状态请求扩展响应与 TLS/SSL 握手“装订”在一起。因此,CA 的服务器不会承受请求的负担,浏览器也不再需要向任何第三方披露用户的浏览习惯。

检查 OCSP 装订支持

支持 OCSP 装订

在继续之前,请使用以下命令检查安装版本。

阿帕奇:

apache2 -v

Nginx:

nginx -v

CentOS/Fedora 用户替换apache2httpd.

检索 CA 包

以 PEM 格式检索根 CA 和中间 CA 的证书,并将它们保存在一个文件中。这适用于 StartSSL 的根和中间 CA 证书。

cd /etc/ssl
wget -O - https://www.startssl.com/certs/ca.pem https://www.startssl.com/certs/sub.class1.server.ca.pem | tee -a ca-certs.pem> /dev/null

如果您的 CA 提供 DER 格式的证书,请将它们转换为 PEM。例如,DigiCert 提供 DER 格式的证书。要下载它们并转换为 PEM,请使用以下命令:

cd /etc/ssl
wget -O - https://www.digicert.com/CACerts/DigiCertHighAssuranceEVRootCA.crt | openssl x509 -inform DER -outform PEM | tee -a ca-certs.pem> /dev/null
wget -O - https://www.digicert.com/CACerts/DigiCertHighAssuranceEVCA-1.crt | openssl x509 -inform DER -outform PEM | tee -a ca-certs.pem> /dev/null

两组命令都用于tee写入文件,因此您可以sudo tee在以非根用户身份登录时使用。

在 Apache 上配置 OCSP 装订

编辑 SSL 虚拟主机文件并将这些行放在指令

sudo nano /etc/apache2/sites-enabled/example.com-ssl.conf
SSLCACertificateFile /etc/ssl/ca-certs.pem
SSLUseStapling on

必须在外部 指定缓存位置。

sudo nano /etc/apache2/sites-enabled/example.com-ssl.conf
SSLStaplingCache shmcb:/tmp/stapling_cache(128000)

如果您按照本文在 Apache 上设置 SSL 站点,虚拟主机文件将如下所示:

/etc/apache2/sites-enabled/example.com-ssl.conf


    SSLStaplingCache shmcb:/tmp/stapling_cache(128000)
    

            ServerAdmin webmaster@localhost
            ServerName example.com
            DocumentRoot /var/www

            SSLEngine on

            SSLCertificateFile /etc/apache2/ssl/example.com/apache.crt
            SSLCertificateKeyFile /etc/apache2/ssl/example.com/apache.key

            SSLCACertificateFile /etc/ssl/ca-certs.pem
            SSLUseStapling on
    

做一个configtest检查错误。

apachectl -t

Syntax OK如果显示,请重新加载。

service apache2 reload

在 IE(Vista 及更高版本)或 Firefox 26 上访问网站并检查错误日志。

tail /var/log/apache2/error.log

如果指令中定义的文件SSLCACertificateFile丢失,则会显示类似于以下内容的证书错误。

[Fri May 09 23:36:44.055900 2014] [ssl:error] [pid 1491:tid 139921007208320] AH02217: ssl_stapling_init_cert: Can't retrieve issuer certificate!
[Fri May 09 23:36:44.056018 2014] [ssl:error] [pid 1491:tid 139921007208320] AH02235: Unable to configure server certificate for stapling

如果没有显示此类错误,请继续执行最后一步。

在 Nginx 上配置 OCSP 装订

编辑 SSL 虚拟主机文件并将以下指令放入该server {}部分。

sudo nano /etc/nginx/sites-enabled/example.com.ssl
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/ssl/private/ca-certs.pem;

如果您按照本文在 Nginx 上设置 SSL 主机,完整的虚拟主机文件将如下所示:

/etc/nginx/sites-enabled/example.com.ssl

server {

        listen   443;
        server_name example.org;

        root /usr/share/nginx/www;
        index index.html index.htm;

        ssl on;
        ssl_certificate /etc/nginx/ssl/example.org/server.crt;
        ssl_certificate_key /etc/nginx/ssl/example.org/server.key;

        ssl_stapling on;
        ssl_stapling_verify on;
        ssl_trusted_certificate /etc/ssl/private/ca-certs.pem;
}

做一个configtest看看是否一切正确。

service nginx configtest

然后重新加载nginx服务。

service nginx reload

在 IE(Vista 及更高版本)或 Firefox 26 上访问网站并检查错误日志。

tail /var/log/nginx/error.log

如果中定义的文件ssl_trusted_certificate缺少证书,则会显示类似于以下内容的错误:

2014/05/09 17:38:16 [error] 1580#0: OCSP_basic_verify() failed (SSL: error:27069065:OCSP routines:OCSP_basic_verify:certificate verify error:Verify error:unable to get local issuer certificate) while requesting certificate status, responder: ocsp.startssl.com

如果没有显示此类错误,请继续执行下一步。

测试 OCSP 装订

将解释两种方法来测试 OCSP 装订是否正常工作 - opensslQualys 的命令行工具和 SSL 测试。

OpenSSL 命令

此命令的输出显示一个部分,说明您的 Web 服务器是否使用 OCSP 数据响应。我们grep这个特定的部分并显示它。

echo QUIT | openssl s_client -connect www.digitalocean.com:443 -status 2> /dev/null | grep -A 17 'OCSP response:' | grep -B 17 'Next Update'

替换www.digitalocean.com为您的域名。如果 OCSP 装订工作正常,则会显示以下输出。

OCSP response:
======================================
OCSP Response Data:
    OCSP Response Status: successful (0x0)
    Response Type: Basic OCSP Response
    Version: 1 (0x0)
    Responder Id: 4C58CB25F0414F52F428C881439BA6A8A0E692E5
    Produced At: May  9 08:45:00 2014 GMT
    Responses:
    Certificate ID:
      Hash Algorithm: sha1
      Issuer Name Hash: B8A299F09D061DD5C1588F76CC89FF57092B94DD
      Issuer Key Hash: 4C58CB25F0414F52F428C881439BA6A8A0E692E5
      Serial Number: 0161FF00CCBFF6C07D2D3BB4D8340A23
    Cert Status: good
    This Update: May  9 08:45:00 2014 GMT
    Next Update: May 16 09:00:00 2014 GMT

如果 OCSP 装订不起作用,则不会显示任何输出。

Qualys 在线 SSL 测试

要在线查看此信息,请访问此网站并输入您的域名。一旦测试完成,请在“协议详细信息”部分下进行检查。

Qualys SSL 报告

补充阅读

如何在 Apache 和 Nginx 上配置 OCSP Stapling
标签: