对于颁发的证书,如果因为一些特殊原因,例如私钥泄漏、证书信息有误、颁发了其它域名证书等等,这样,就需要吊销某些证书,这里关键就是浏览器或客户端如何知道当前使用的证书已经被吊销了。
为了解决这一问题,引入了 Certificate Revocation List, CRL 和 Online Certificate Status Protocol, OCSP 技术,前者需要用户定期下载用于脱机使用,后者则可实时在线查询。
简介
OCSP 是一个互联网协议,用于获取符合 X.509 标准数字证书的状态,用于在公钥基础设施体系中替代证书吊销列表 CRL 来查询数字证书的状态,当用户试图访问一个服务器时,在线证书状态协议发送一个对于证书状态信息的请求。服务器回复一个 “有效”、“过期"或"未知"的响应。
OSCP Stapling (OSCP 封装)
OSCP 原设计是在客户端检查证书是否合法,但会因为阻塞页面渲染,一般会通过 OSCP Stapling 功能由服务端查询。
服务端会缓存查询结果,当客户端向服务器发起 TLS 握手请求时,服务器将证书的 OCSP 信息和证书链一起发送到客户端,这样可以避免客户端验证产生的阻塞问题。由于 OCSP 信息是无法伪造的,因此这一过程不会产生额外的安全问题。
注意,使用 OCSP Stapling 功能需要客户端支持 OCSP 扩展字段,如果客户端不支持,则无法生效。
OpenSSL 验证
在服务端启用 OCSP Stapling 之后,客户端还需要在建立 TLS 时,在 Client Hello
中启用 status_request
这个 TLS 扩展,告诉服务端自己希望得到 OCSP Response
,目前主流浏览器都会带上该选项。
使用 OpenSSL 时,需要添加 -status
参数,完整命令如下。
openssl s_client -connect www.baidu.com:443 -status -tlsextdebug < /dev/null 2>&1 | grep -i "OCSP response"
openssl s_client -connect www.example.com:443 -status -tlsextdebug < /dev/null 2>&1 | grep -i "OCSP response"
如果在服务器上部署了多个 HTTPs 站点,还需要加上 -servername
参数启用 SNI 。其中 OCSP response: no response sent
表示不支持,正常会有 OCSP response data
内容。
如果支持,那么其输出的内容大致如下。
OCSP Response Data:
OCSP Response Status: successful (0x0)
Response Type: Basic OCSP Response
Version: 1 (0x0)
Responder Id: B76BA2EAA8AA848C79EAB4DA0F98B2C59576B9F4
Produced At: Mar 31 05:15:02 2021 GMT
Responses:
Certificate ID:
Hash Algorithm: sha1
Issuer Name Hash: E4E395A229D3D4C1C31FF0980C0B4EC0098AABD8
Issuer Key Hash: B76BA2EAA8AA848C79EAB4DA0F98B2C59576B9F4
Serial Number: 0FBE08B0854D05738AB0CCE1C9AFEEC9
Cert Status: good
This Update: Mar 31 05:15:02 2021 GMT
Next Update: Apr 7 04:30:02 2021 GMT
Signature Algorithm: sha256WithRSAEncryption
67:38:25:99:e9:ce:e2:cb:01:52:1b:6f:ee:cd:36:6b:0e:a5:
87:ee:71:54:07:24:7f:c9:3b:1a:a1:fe:0d:b7:02:94:6a:35:
9d:73:23:16:f0:a1:d6:c2:92:68:59:8e:b1:91:59:bd:69:39:
f3:d2:e9:5c:75:57:b4:77:26:e6:44:99:50:30:34:21:39:ad:
db:4f:2c:2a:d4:b8:08:95:91:62:4c:17:a0:bc:d5:ee:93:a2:
9f:08:a6:d6:6d:21:25:34:46:06:97:21:bd:5a:7d:1e:5a:38:
14:b4:c3:89:e0:6d:1a:a8:95:39:c6:a4:f1:d4:53:dd:f6:09:
03:66:0e:12:45:79:a0:f6:0f:10:cb:17:c9:03:cc:82:f2:9b:
57:8a:85:73:fb:f9:5b:98:e5:78:3c:de:a2:b6:01:18:f6:d0:
75:11:8a:b4:89:55:a5:6b:05:43:b2:d6:2b:e8:91:97:70:f5:
aa:ea:52:5c:12:11:90:bd:ed:11:7b:76:25:5d:d4:6e:ce:ac:
73:ca:4a:84:c1:d5:70:af:49:30:36:2c:6e:d7:42:9e:b5:ef:
32:71:f9:23:17:9e:47:ee:86:eb:fd:d8:0a:ac:30:95:d1:f3:
39:d8:28:d1:89:16:b8:e5:c7:cd:d3:6c:c4:cb:7c:99:91:43:
39:0e:e0:b6
可以看到 OCSP Response Data 所包含的内容,有些还会包含 Certificate 内容,主要是用来验证响应的数据是正常的。
其它
可以通过 www.ssllabs.com 查看是否支持 OSCP Stapling 选项。
示例
一般在证书中会包含了 OSCP 的访问地址信息,例如 www.baidu.com
证书中会包含如下内容。
如果服务端使用了 stapled OCSP response
- 证书获取,可以从本地加载,或者通过连接远端服务器获取。
- OCSP 的地址优先从证书中读取,如果证书中没有提供,则使用命令行指定的地址。
在 www.example.com
中,提供了 stapling OCSP
机制,注意,偶尔可能会返回空。其它,如 www.baidu.com
一般不会缓存。