一、说明
1. OCSP装订(英语:OCSP Stapling)
正式名称为TLS证书状态查询扩展,可代替在线证书状态协议(OCSP)来查询X.509证书的状态。服务器在TLS握手时发送事先缓存的OCSP响应,用户只需验证该响应的有效性而不用再向数字证书认证机构(CA)发送请求。
2. 动机
OCSP装订解决了在线证书协议中的大多数问题。CA给网站颁发证书之后,网站的每个访问者都会进行OCSP查询。因此使用在线证书协议时,高并发的请求会给CA的服务器带来很大的压力。同时由于必须和CA建立连接,OCSP查询还会影响浏览器打开页面的速度并泄漏用户隐私。此外,当OCSP查询无法得到响应时,浏览器必须选择是否在无法确认证书状态的情况下继续连接,造成安全性和可用性二选一的困局。
3. 意义
在服务器上部署ocsp装订,能大大缓解链接数与高并发量。省去多次握手操作,使网站访问速度更快。
二、环境准备
1. 环境简介
Linux或Windows服务器一台。系统自带有openssl工具,或单独安装的openssl工具。
2. 网络要求
此站点拥有一个合法的外网可以访问的域名地址。
3. 中间件版本
nginx/1.10.1版本以上。
三、获取证书
1. 下载证书
在您完成申请数安时代GDCA服务器证书的流程后,登录系统将会下载一个压缩文件,使用Nginx_Other_Server里面的文件;文件内有issuer.crt,www.domainame.com_chain.crt(此为原申请的域名命名的证书)。
2. 准备证书
站点证书(www.domainame.com_chain.crt)+ 根证书(root.crt)+ 中级证书(issuer.crt)。以及准备申请证书时填写csr下载的私钥www.domainame.com.key文件,以便后续部署使用。除了站点证书与中级证书已有,根证书可以根据以下步骤获取:
双击证书-选择证书路径-“GDCA TrustAUTH R5 ROOT”-查看证书。
选择详细信息-复制到文件,点击下一步。
选择CER格式,点击下一步。
选择导出的目录,命名为root.crt,点击下一步,然后点击完成导出即可。
四、生成OCSP Stapling
1. 上传证书
将三份证书上传到服务器,生成OCSP Stapling验证文件。即是将中级证书与根证书合并一起。注意,中级证书在上、根证书在下。
Linux下可使用命令,重命名为hecheng.crt。如下:
cat issuer.crt >> hecheng.crt
cat root.crt >> hecheng.crt
Windows下使用文本编辑打开中级证书与根证书分别按照中级证书在上、根证书在下的顺序排列合并,然后重命名即可:
最后合并生成的hecheng.crt就是所需的ocsp stapling验证文件。
2. 验证ocsp
查看站点证书对应的ocsp服务地址。命令:
openssl x509 -noout -ocsp_uri -in www.domainame.com_chain.crt
例如GDCA自主证书dv的ocsp地址是http://ocsp6.gdca.com.cn/dv
以GDCA dv证书为例,获取站点证书的 OCSP Response。执行以下命令:
openssl ocsp -no_nonce -issuer issuer.crt -CAfile hecheng.crt -VAfile hecheng.crt -cert www.domainame.com_chain.crt -url http://ocsp6.gdca.com.cn/dv -text -header "HOST" "ocsp6.gdca.com.cn/dv" #选项大意: -issuer #中级证书 -CAfile #ocsp stapling验证的文件,即刚合并的证书 -VAfile #ocsp stapling验证的文件,即刚合并的证书 -cert #站点证书 -url #ocsp地址 -header "HOST" #去掉主机头的ocsp地址
若执行没有错误,会返回以下:
若返回:
注意:如果站点证书的ocsp地址是http://ocsp6.gdca.com.cn/dv,由于在Windows访问是需要下载一个二进制文件,而Linux访问与Windows的下载机制不一样,所以会报这个错误。此错误不影响,可以忽略。
五、Nginx启用OCSP Stapling
1. 说明
前提下nginx要先部署ssl证书,并可以正常访问。配置参考如下:
server { listen 443; server_name www.domainame.com; #证书绑定的网站域名 ssl on; ssl_certificate conf/www.domainame.com_chain.crt; #证书公钥 ssl_certificate_key conf/www.domainame.com.key; #证书私钥 ssl_stapling on; #开启stapling ssl_stapling_verify on; #开启stapling验证 ssl_trusted_certificate conf/hecheng.crt; #指定验证的证书 ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!3DES:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { root html; #站点目录 index index.html index.htm; } }
配置完成,保存退出。重启nginx,就成功启用了OCSP Stapling。
2. 测试OCSP Stapling状态。
(1)命令如下:
openssl s_client -connect www.domainame.com:443 -servername www.domainame.com -status -tlsextdebug < /dev/null 2>&1 | grep -i "OCSP response" #注:测试的是站点域名与https默认端口443,域名也可用本地127.0.0.1来代替测试。
若站点返回OCSP response: no response sent,代表开启失败。
若站点已成功启用OCSP Stapling,会返回以下提示:
(2)或者使用:
echo QUIT | openssl s_client -connect www.domainame.com:443 -status 2> /dev/null | grep -A 17 'OCSP response:' #注:测试的是站点域名与https默认端口443,域名也可用本地127.0.0.1来代替测试。
执行后,若没有返回信息,则开启失败。
若站点已成功启用OCSP Stapling,会返回以下提示:
3. 外网域名检测
检测地址:https://www.ssllabs.com/ssltest/
输入域名,点击submit进行检测。
若ocsp stapling这项是yes,代表站点ocsp stapling已成功开启。