如何在Apache和Nginx上配置OCSP装订
介绍
OCSP 装订是一种 TLS/SSL 扩展,旨在提高 SSL 协商的性能,同时维护访问者的隐私。 在继续配置之前,简要介绍一下证书吊销的工作原理。 本文使用StartSSL颁发的免费证书进行演示。
本教程将使用下面概述的 Apache 和 Nginx 的基本配置:
关于 OCSP
OCSP(在线证书状态协议)是一种用于检查 SSL 证书是否已被吊销的协议。 它被创建为 CRL 的替代方案,以减少 SSL 协商时间。 使用 CRL(证书撤销列表),浏览器会下载已撤销证书序列号的列表并验证当前证书,这会增加 SSL 协商时间。 在 OCSP 中,浏览器向 OCSP URL 发送请求并接收包含证书有效性状态的响应。 以下屏幕截图显示了 digitalocean.com 的 OCSP URI。
关于 OCSP 装订
OCSP 有两个主要问题:隐私和 CA 服务器上的繁重负载。
由于 OCSP 要求浏览器联系 CA 以确认证书的有效性,因此会损害隐私。 CA 知道正在访问哪个网站以及谁访问了它。
如果 HTTPS 网站有大量访问者,CA 的 OCSP 服务器必须处理访问者发出的所有 OCSP 请求。
实施 OCSP 装订时,证书持有者(读取 Web 服务器)会自行查询 OCSP 服务器并缓存响应。 该响应通过 Certificate Status Request 扩展响应与 TLS/SSL 握手“装订”在一起。 这样一来,CA 的服务器就没有请求的负担,浏览器也不再需要向任何第三方披露用户的浏览习惯。
检查 OCSP 装订支持
支持 OCSP 装订
- Apache HTTP 服务器 (>=2.3.3)
- Nginx (>=1.3.7)
在继续之前,请使用以下命令检查您的安装版本。
阿帕奇:
apache2 -v
Nginx:
nginx -v
CentOS/Fedora 用户将 apache2
替换为 httpd
。
检索 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
写入文件,因此如果以非 root 用户身份登录,则可以使用 sudo tee
。
在 Apache 上配置 OCSP 装订
编辑 SSL 虚拟主机文件并将这些行 放在 <VirtualHost></VirtualHost>
指令的 内。
sudo nano /etc/apache2/sites-enabled/example.com-ssl.conf
SSLCACertificateFile /etc/ssl/ca-certs.pem SSLUseStapling on
缓存位置必须在 outside <VirtualHost></VirtualHost>
中指定。
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
<IfModule mod_ssl.c> SSLStaplingCache shmcb:/tmp/stapling_cache(128000) <VirtualHost *:443> 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 </VirtualHost> </IfModule>
执行 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 装订是否正常工作 - openssl
命令行工具和 Qualys 的 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 测试
要在线查看此内容,请访问 这个网站 并输入您的域名。 测试完成后,检查 Protocol Details 部分。
补充阅读
- Mozilla 关于 OCSP 装订的文章 - http://en.wikipedia.org/wiki/OCSP_stapling
- 关于 OCSP 装订的维基百科文章 - http://en.wikipedia.org/wiki/OCSP_stapling