前言:以往提到过,钓鱼网站会仿冒我们,如果我们的私钥泄露了,如果被不法分子得到了私钥,他们就能假装是我们网站。那现在,我们要做的是生成新私钥并申请新证书。问题来了,旧的证书亦然存在且有效,我们没法阻止不法分子恶意去使用该证书。这时候,我们就需要证书撤销(Certificate Revocation)
1、定义
Certificate Revocation(证书撤销)是使特定证书失效的过程。
2、有2种方式来检查证书是否被撤销
- CRL - Certificate Revocation List
- OCSP - Online Certificate Status Protocol
3、CRL - Certificate Revocation List,证书撤销列表
- 由CA维护的、被撤销的证书的列表
- CRL的位置嵌入在每一张证书里
- CRL包含证书序列号和被撤销的日期,有时CRL条目还包含撤销原因
- Client如何检查该列表
- Client向Server请求一张证书,然后Server会提供证书
- Client一旦得到证书,就会从证书里定位到CRL分发点,然后从CA下载CRL
- Client会检查CRL的每个条目来找到证书的序列号(如果证书序列号出现在CRL中,说明该证书已经被撤销,不可信了;反之,如果没有在CRL中找到该证书序列号,说明证书没有被撤销,我们可以继续信任它)
- 对CRL流程的批评
- 繁琐而缓慢
- CRL非常长,有成千上万行,每次Client访问新的SSL网站,都要检查证书撤销列表,意味着浏览器要加载很久
- 此外,这些CRL是公共托管的列表,因而不是实时更新的(CA每5-14天更新一次,如果我证书私钥今天泄露了,而CA昨天刚更新一次CRL,那我后面两周就不安全了)
- 经常甚至没有被检查
- 而相比安全,用户更倾向于速度
- 一些浏览器维护本地CRL
- Chrome:CRLSet;Firefox:oneCRL
- 繁琐而缓慢
4、OCSP - Online Certificate Status Protocol,在线证书状态协议
- “OCSP Responder”(OCSP应答器)由CA所维护
- 提供实时证书状态
- 优点是可以根据序列号单独请求状态(不用每次都检查成千上万个条目了)
- OCSP应答器的位置被嵌入在每张证书里(和CRL一样)
- 请求是通过HTTP
- 证书状态不是敏感信息
- 状态由CA所签名(用CA的公钥可以验证是不是对的OCSP应答器)
- OCSP流程
- Client向Server请求证书,然后查看证书里的OCSP应答器的URL
- Client向OCSP应答器(由CA所维护)请求证书状态
- OCSP应答器会回复状态信息
- Good;Revoked;Unknown
- OCSP的2个批评
- 隐私:每次Client访问Server,CA都会被联系到
- CA知道Server的访问数据
- CA知道到Client访问浏览器的历史信息
- 需要非常有弹性(resilient)的OCSP应答器
- OCSP应答器要随时准备好应对大量的访问,万一因为访问量过大而导致服务器超载并且宕机了,那么Client就没法查看证书状态了
- 因为OCSP是通过HTTP进行请求,而HTTP请求能够被中断(虽然因为CA的签名没法更改状态,但可以直接中断)
- 隐私:每次Client访问Server,CA都会被联系到
5、OCSP Stapling(OCSP装订,修正了OCSP的问题)-目前行业内最好的解决方案
- Server会间歇性地请求自己的状态
- 刷新间隔:5分钟 - 10天
- 状态带有时间戳并且被CA签名
- Client请求证书及其状态
- Server提供证书以及从CA得到的状态
- 状态是可信的,因为有CA的签名,而我们信任该CA
- Server的安全负担
- 而不是Client(这是好事,Client不需要做太多安全相关的事情)
- 需要支持TLS1.2+或更高版本
- 也需要Client和Server支持
- 目前支持的只有30%多的Server
参考文献
1、网站:Practical Networking.net:Practical TLS