出现的原因
当我们的证书被CA
签署出来之后,因为一些特殊的情况(私钥泄露、用户放弃等等)我们需要去吊销该张证书,那该证书被吊销后,浏览器如何去判断出该证书是否已经被吊销了呢?毕竟,证书中是没有吊销信息的。检测证书吊销的情况一般由两种,分别是CRL
和OCSP
。现在的浏览器一般都是使用OCSP
的方式查询证书是否已经被吊销。但这两种方式都有缺陷。
CRL
CRL
(Certificate revocation list):证书吊销列表。
在OCSP
还没有出现的年代,浏览器检测证书是否被吊销,就是使用CRL
的方式,CRL
需要浏览器去指定的位置下载该吊销列表,这种方式有两个缺点:
1.有可能文件会很大,浪费网络开销。
2.具有一定的滞后性,新吊销的证书只有等CRL
文件更新后才能检测出吊销情况。
OCSP
OCSP
(Online Certificate Status Protocol):在线证书状态协议。
使用OCSP
就不需要去下载吊销列表了,浏览器直接去CA
的OCSP
服务器对证书的吊销情况做验证。但其中也会有一个问题。如果该证书确实已将被吊销了,但是因为CA
的OCSP
服务器因为某些原因不可达,那浏览器就不知道该如何处理了。一般也就默认放行,不进行拦截。还有一种情况是浏览器不知道该网站支持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检测结果