OCSP 装订是一种 TLS/SSL 扩展,旨在提高 SSL 协商的性能,同时维护访问者隐私。在继续配置之前,先简要介绍一下证书吊销的工作原理。本文使用免费证书由 StartSSL 发出来演示。
本教程将使用下面概述的 Apache 和 Nginx 的基本配置:
- 如何在 Ubuntu 12.04 上使用 Apache 在一个 IP 上设置多个 SSL 证书
- 如何在 Ubuntu 12.04 上使用 Nginx 在一个 IP 上设置多个 SSL 证书
OCSP(在线证书状态协议)是用于检查 SSL 证书是否已被吊销的协议。它是作为 CRL 的替代方案创建的,以减少 SSL 协商时间。使用 CRL(证书吊销列表),浏览器会下载已吊销的证书序列号列表并验证当前证书,这会增加 SSL 协商时间。在 OCSP 中,浏览器向 OCSP URL 发送请求并接收包含证书有效性状态的响应。以下屏幕截图显示了 OCSP URI数字海洋网.
OCSP 有两个主要问题:隐私和 CA 服务器负载过重。
由于 OCSP 要求浏览器联系 CA 来确认证书有效性,因此会损害隐私。 CA 知道正在访问哪个网站以及谁访问了该网站。
如果 HTTPS 网站有大量访问者,CA 的 OCSP 服务器必须处理访问者发出的所有 OCSP 请求。
When OCSP stapling is implemented the certificate holder (read web server) queries the OCSP server themselves and caches the response. This response is “stapled” with the TLS/SSL Handshake via the Certificate Status Request extension response. As a result the CA’s servers are not burdened with requests and browsers no longer need to disclose users’ browsing habits to any third party.
支持 OCSP 装订
- Apache HTTP 服务器 (>=2.3.3)
- Nginx (>=1.3.7)
在继续之前,请使用以下命令检查安装的版本。
Apache:
apache2 -v
Nginx:
nginx -v
CentOS/Fedora用户更换apache2
with httpd
.
检索 PEM 格式的根 CA 和中间 CA 的证书并将它们保存在单个文件中。这适用于 StartSSL 的根 CA 证书和中间 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
如果以非 root 用户身份登录。
Edit the SSL virtual hosts file and place these lines inside the <VirtualHost></VirtualHost>
directive.
sudo nano /etc/apache2/sites-enabled/example.com-ssl.conf
SSLCACertificateFile /etc/ssl/ca-certs.pem
SSLUseStapling on
A cache location has to be specified 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>
Do a 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
如果没有显示此类错误,请继续执行最后一步。
编辑 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;
}
Do a 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 装订是否正常工作的方法 -openssl
Qualys 的命令行工具和 SSL 测试。
此命令的输出显示一个部分,说明您的 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'
Replace 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 装订不起作用,则不会显示任何输出。
To check this online go to this website and enter your domain name. Once testing completes check under the Protocol Details section.
- Mozilla 关于 OCSP 装订的文章 -http://en.wikipedia.org/wiki/OCSP_stapling
- 关于 OCSP 装订的维基百科文章 -http://en.wikipedia.org/wiki/OCSP_stapling