OCSP Must-Staple

出现的原因

当我们的证书被CA签署出来之后,因为一些特殊的情况(私钥泄露、用户放弃等等)我们需要去吊销该张证书,那该证书被吊销后,浏览器如何去判断出该证书是否已经被吊销了呢?毕竟,证书中是没有吊销信息的。检测证书吊销的情况一般由两种,分别是CRLOCSP。现在的浏览器一般都是使用OCSP的方式查询证书是否已经被吊销。但这两种方式都有缺陷。

CRL

CRL(Certificate revocation list):证书吊销列表。
OCSP还没有出现的年代,浏览器检测证书是否被吊销,就是使用CRL的方式,CRL需要浏览器去指定的位置下载该吊销列表,这种方式有两个缺点:
1.有可能文件会很大,浪费网络开销。
2.具有一定的滞后性,新吊销的证书只有等CRL文件更新后才能检测出吊销情况。

OCSP

OCSP(Online Certificate Status Protocol):在线证书状态协议。
使用OCSP就不需要去下载吊销列表了,浏览器直接去CAOCSP服务器对证书的吊销情况做验证。但其中也会有一个问题。如果该证书确实已将被吊销了,但是因为CAOCSP服务器因为某些原因不可达,那浏览器就不知道该如何处理了。一般也就默认放行,不进行拦截。还有一种情况是浏览器不知道该网站支持OCSP,以及是否应该给予OCSP响应。

OCSP Must-Staple

针对上面这些原因,就提出了OCSP Must-Staple。浏览器必须检测OCSP响应。这是一个证书中的扩展。目前能够签署出该扩展的证书的CA只有Let's Encrypt
如果要设置OCSP Must-Staple,需要在使用openssl生成csr的时候,修改openssl.cnf中的内容:

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
1.3.6.1.5.5.7.1.24 = DER:30:03:02:01:05

v3_req中添加1.3.6.1.5.5.7.1.24 = DER:30:03:02:01:05
如果是使用openssl 1.1.0或更高的版本,可以这样设置:

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
tlsfeature = status_request

添加tlsfeature=status_request即可。
然后生成该csr文件,使用该csr文件,把改csr提交给支持Let's Encrypt证书签发的机构。推荐使用freessl选择let's Encrypt,然后上传自己生成的csr,等待签署完成。

号外

就和开头的截图所示,我们MySSL现在也能检测OCSP Must-Staple了。scotthelme.co.uk检测结果