0%

HTTPS证书吊销

HTTPS证书吊销

事情要说我想申请一个通配符证书说起,从通配符证书到let’s encrypt到OCSP服务器被墙到学习HTTPS证书吊销的奇怪学习链

先在这推荐一下let’s encrypt,免费发放通配符证书,再也不要一个子域名一个子域名的申请啦
证书有效期只有三个月,可以自动更新,但是自动更新需要的OCSP服务器被墙,导致了这篇文章的出现,愚蠢的解决方案是每三个月重新申请新的证书

HTTPS认证过程

在这之前,先简单的复习一下HTTPS到底是怎么完成双向认证的
https认证
1.服务器向客户端发送证书和公钥,客户端看一下证书的签发单在不在本地安装的证书里面,再看看过期时间,域名对应之类的,用发过来的公钥算一下这个证书和签名对不对得上,有机会还会看看这个证书是不是被吊销了(这就是这篇文章的主题所在)
2.验证通过,客户端产生一个随机数,用公钥加密还给服务器,服务器解密之后这个随机数就是两方的对称加密密钥了
3.开始用对称密钥通信

显然,如果存在一个中间人,他用DNS污染把域名解析到了自己这边,而服务器的公钥和证书是公开的,也就是说中间人完全可以做到通过验证这一步。但是,没有私钥,也就意味着随机数解密不出来,既读不懂用户发来的请求,也无法返回伪造的回复

上述安全策略是在证书的绝对不可伪造和公钥加密绝对安全的前提下成立的
但是如果服务器连私钥都泄露出去了,中间人就可以为所欲为了

因此,如果证书私钥遭到泄露,我们就需要去吊销这份证书,防止遭受攻击

证书吊销

证书吊销了,但是中间人拿到的证书和密钥你肯定管不到,那就只能整个告示栏昭告天下,这个证书已经泄露了,不能用了,那么昭告天下的方式有两种,CRL和OCSP(这个服务器被墙就是文章诞生的原因)
证书在签发的时候就会附带上CRL和OCSP验证对应的服务器地址

CRL

Certificate Revocation Lists 证书撤销列表
就是各CA厂商把自己签过的已撤销的证书打包成一个大文件,把所有被吊销的证书都放进去,每个文件都至少在1M以上,并且这个文件更新的频率还取决于厂商,如果CA厂商一个星期更新一次,那这个被偷走的证书就能为所欲为一个星期,就算更新的快,用户正常访问没被偷证书的网站还要下一个1M以上的撤销列表看看有没有被撤销,用户体验,极差

OCSP

Online Certificate Status Protocol 在线证书状态协议
就是从打包下超级大文件变成了和验证服务器交互查数据库
CA也不需要更新超级大文件了,吊销一个更新一个数据库就行了,效率upup
但是这个也不是特别棒,每次http请求都要对OCSP服务器进行额外请求,不过和下载1M+的列表相比已经很不错了,还有一个问题就是用户对网站的浏览情况被第三方(OCSP服务器)知晓,存在隐私泄露

暂且不考虑额外请求的开销和隐私泄露,这一切似乎都很完美,不过下一个问题出现了
如果OCSP服务器不可达咋办(比如let’s encrypt的OCSP服务器被墙了。。。)
如果是因为网络垃圾或者墙这种不可抗力使OCSP服务不可达,有两种解决模式
1.hard-fail 原地爆炸,直接认定证书无效,不给访问(那可太糟糕了)
2.soft-fail 我们一笑而过,就当无事发生
hard-fail的话像OCSP被墙那我们的网站就都访问不了了,好像目前没有厂商是这么实现的浏览器,soft-fail的话就出现了严重的安全问题,因为攻击者虽然不能伪造请求,但是完全可以阻断请求,你的流量经过我手,你无法获知我现在伪造的这个服务器的证书有没有被吊销,OCSP形同虚设

OCSP Stapling

继续修修补补,我们迎来了修订版的OCSP协议
让web服务器去拿OCSP响应,当然也要进行加密,不然中间人还是任意伪造,减少用户开销保护用户隐私,但是还是不能避免OCSP服务器被墙的悲惨事实(比如我的服务器也在国内。。。。)
然而它并没有解决OCSP不可达的问题

OCSP Must-Staple

解决OCSP不可达时咋办,不过并不怎么流行
让域名持有者自己决定OCSP不可达时的失败方式,Let’s Encrypt支持该方式,不过并不是RFC标准

浏览器处理

之后就是各大浏览器厂商自己对OCSP的处理方式了
可以通过选项决定OCSP不可达时是使用hard-fail还是soft-fail,不过用edge,Chrome和Safari试过之后感觉这三家都是soft-fail
Chrome似乎觉得OCSP不太行,直接放弃了对OCSP的支持开始搞自己的

后记

总而言之,OCSP服务器被墙,在目前主流浏览器的默认情况下,并不会影响访问,大家都是默认soft-fail的,但是当你使用let’s encrypt的自动化脚本去重新更新证书的时候,会有一步与OCSP服务器通信的步骤,看看这个需要续签的证书有没有过期,然后OCSP被墙了,不能自动续签了,这就是这篇文章的由来

let’s encrypt续签方式

最新更新续签方式,OCSP服务器被墙其实只是污染了域名,可以自己在hosts文件里面手动添加一项23.32.3.72 ocsp.int-x3.letsencrypt.org就能用certbot renew自动更新了(只要他的服务器IP一直保持这个不变)

参考链接

主要参考了该大哥的文章,写的很详细了(原来用的Chrome开发者版,在87之后突然出现了奇怪的bug,知乎专栏访问不上了,逼得我回到稳定版的Chrome,现在是86)
你不在意的HTTPS证书吊销机制
从这个大哥这里找到知乎大哥的文章的
Let’s Encrypt OCSP 域名被封