OCSP原理
在HTTPS的新时代,我们需要使用https对应的tls证书,这保证了一定的安全性,但是也带来了新的困难,证书的真实性和有效性得不到实际的保证,我们需要一种方案来检测证书是否真实有效。此时有两种方案来保证https证书的安全性,一种是客户端通过证书颁发机构的证书吊销列表(CRL)进行校验,或者是通过OCSP记录验证网站服务器的证书有效性。这两种方案都是存在的,但是由于CA会不断的向CRL文件中增加证书吊销记录,因此CRL文件就会变得越来越大,客户端就需要预花费较长的时间来下载CRL文件。
对比之下OCSP方案就更为有效了,OCSP(Online Certificate Status Protocol,在线证书状态协议)是用来检验证书合法性的在线查询服务,一般由证书所属 CA 提供,其作用域较多的出现在浏览器预请求TLS握手的同时校验OCSP接口,验证证书的有效性且OCSP每次只查询一条记录,但是OCSP本身也是一个查询过程,也有DNS、TCP建立、服务器返回等较为耗时的操作,最终导致了网站的握手时间边长。
其次在OCSP方案中因为安全问题,如果有黑客或者其他非法组织对CA机构节点进行DDos攻击的话,客户端无法从OCSP服务器上获取对应的证书验证结果,那么对应的证书便不会被客户端信任,网页也就出现了“打不开”的情况。
进而在后续的发展中出现了OCSP Stapling技术,该方案采用服务端校验证书有效性,由服务器缓存OCSP的权威认证结果,并将结果随tls一并返回给客户端,让客户端自行校验。这样一来,客户端无需每次都要向CA请求OCSP查询,有效的提高了tls握手效率,同时也在一定程度上降低了由于CA机构的OCSP节点服务器被攻击导致的证书无法返回导致的客户网站打不开的可能性。
Warning
:如果使用了CDN的话,CDN对应的域没必要开OCSP,并且似乎国内的很多CDN都没有支持OCSP方案。
准备工作
先到TrustAsia申请证书,申请成功之后一般都是返回的一个压缩包,其实压缩包的内容都是一样的,虽然区分了不同的文件夹
以Apache的证书为例
其中1_xxx
为完整证书链 = 2 + 3
其次2_xxx
为子证书链
其次3_xxx
为中间证书链
这里其实缺失了一部分,叫根证书链,但是根证书链一般都是公开的,所以不需要过于追究根证书链的问题。顺便列一个对应的根证书地址:https://www.websecurity.symantec.com/content/dam/websitesecurity/support/digicert/geotrust/root/DigiCertGlobalRootCA.pem
这个链接在后面的时候有用得上,单是是非必须的文件。
安装配置OCSP
之后来讨论具体的搭建配置OCSP的流程:
第一步,上传并配置好文件名等。。
# 复制已有的APache证书过去 并cd到对应目录
。。。
# 重命名证书为新的名字,其中full=child+middle
mv 1_* ./full.crt && mv 2_* ./child.crt && mv 3_* ./middle.crt
第二步,取得对应的OCSP域地址,准备构造请求地址
openssl x509 -in child.crt -noout -ocsp_uri
# 比如说我这里的结果就是:http://statuse.digitalcertvalidation.com
第三步,测试OCSP能否正常工作
# 构造请求地址,具体描述前文已有
# -verify_other 使用full证书的地址
# -issuer 使用middle证书的地址
# -cert 使用child证书的地址
# -CAfile 使用CA的root地址,这里没有使用,因为不需要
# -respout 生成的文件为:stapling_ocsp
# -header 为了解决有时候域403禁止的问题,可带可不带,具体看情况
openssl ocsp -verify_other full.crt -issuer middle.crt -cert child.crt -no_nonce -text -respout stapling_ocsp -url http://statuse.digitalcertvalidation.com -header "HOST=statuse.digitalcertvalidation.com"
注意由于国内的网络问题,上一步有可能出现一个情况:一直在等待一直在等待,我的方案是手动查询对应的ip,然后再请求即可
nslookup statuse.digitalcertvalidation.com 1.1.1.1
# 这样会获得对应的ip地址,用这个ip去请求一遍就可以了 - 不带header
openssl ocsp -verify_other full.crt -issuer middle.crt -cert child.crt -no_nonce -text -respout stapling_ocsp -url http://72.21.91.29
正常来说就会返回正确的结果并写入到文件`stapling_ocsp`中去,接下来配置下一步
如果出现其他错误请自查
第三步,配置nginx环境
当上一步我们已经得到了stapling_ocsp
文件之后,我们就可以对相应的域进行配置了,配置参数参考下面的内容
# 在对应的域下加入这个代码
ssl_stapling_verify off; # 如果配置了,这个则必须配置ssl_trusted_certificate == -CAfile 一般可以不用写
ssl_stapling on; # OCSP 服务端校验证书有效性,仅启动时校验一次
resolver 1.1.1.1 8.8.4.4 valid=300s; # 自定DNS,这个就是保证OCSP域名有效的方案
resolver_timeout 5s;
ssl_early_data on;
keepalive_requests 100;
ssl_stapling_file /www/server/panel/vhost/cert/xxxxxxxxxxxxxx/stapling_ocsp; # 这里要改成对应路径的stapling_ocsp
最后测试OCSP是否有效
openssl s_client -connect xxx.xxx.com:443 -servername xxx.xxx.com -tls1_1 -tlsextdebug -status | grep -A 17 'OCSP response:'
如果看到有这个就是可用的
相应的这个的意思就是不可用,可能是因为CDN缓存-具体情况请自查,
快速一键-顺便搞了一个一键生成的脚本,具体自测:
配置和宝塔的证书配置地址一致,一般来说不需要修改代码
wget --no-check-certificate -q -O acocsp.sh https://acimg.htt5.com/usr/2020/08/23/1598113782.png && bash acocsp.sh
感觉同时最好再搞一个定时任务去刷一下这个oscp 每晚3点刷一次
bash /root/acocsp.sh -a