用途
互联网世界中我们需要确定对方的身份,比如防止我想和小明说话,但是实际却在和黑客说话这种情况。一种比较常见的认证方式就是数字证书,比如 HTTPS 站点的 SSL 证书。关于 HTTPS 的工作流程的简单介绍,可以看一下我之前的一篇文章——简要说明 HTTPS 是如何保证数据安全。
一般来说客户端收到对方的证书后会沿着证书链确定各级证书是否有效以决定是否信任接收到的证书。在这种验证流程中操作系统、浏览器和安全软件都可以内置一些 CA 的证书以便证书的检查。
如果一个证书是无效的,那么它一定符合下列情况中的至少一个。
- 证书本身过期或者证书链上的某个证书过期。
- 证书本身被吊销或者证书链上的某个证书被吊销。
证书的有效期已经写入证书本身,无需额外的信息即可判断。但是如果一个证书出于某种原因被吊销了(比如私钥泄露),客户端此时无法根据证书所携带的信息来确定是否被吊销。OCSP 就是为了解决这个问题。
协议概述
OCSP 全称 Online Certificate Status Protocol,即在线证书状态协议。它可以让客户端与服务器通信以确定某个证书的状态,即未撤销、已撤销或未知。
笔者并未在协议文档中找到关于 OCSP 所使用的传输机制,报文结构等信息,所以 OCSP 理论上可以有多种实现。
通信流程
客户端向提供 COSP 服务的服务器发送一个请求,包含下列内容。
- 协议版本。
- 服务请求的类型(协议文档并未指明有哪些类型)。
- 打算查询状态的一个或多个证书的 ID。
- 可选的扩展信息。
服务器接收到请求之后首先会检查请求是否符合下列要求。
- 请求格式正确。
- 服务器支持请求中所指定的「服务请求的类型」。
- 客户端提供的信息要足以让服务器做出相应,即不能缺少必要信息。
然后服务器会通过某些方式获取证书的状态,然后响应客户端的请求,响应中包含下列内容。
- 响应内容的语法版本。
- 响应器的 ID。
- 本次响应的生成时间。
- 针对每一个证书的响应,包含下列内容。
- 该证书的 ID。
- 该证书的状态,包含未撤销、已撤销和未知。
- 针对本证书的响应的有效期。
- 可选的扩展信息。
- 可选的扩展信息。
- 使用的签名算法的 ID。
- 本次响应内容的哈希值的签名。
证书状态未知表示服务器不知道这个证书的状态。通常是签发被查询证书的 CA 不受信任,比如自签证书。也有可能是服务器知道的不够多,比如这个证书本身没有问题,但是服务器没有收录。当客户端得到这个回复的时候可以自行选择,比如默认不信任,或者通过其他方式查询状态等。
证书状态为已撤销通常表示为此证书被 CA 撤销,但这并不绝对。对于类似自签证书这样的由不受信任的 CA 签发的证书,服务器也可以在响应中将其标记为已撤销状态,意为服务器打算让客户端直接拒绝这个证书,而不是像证书状态未知那样交给客户端自己去选择。
一旦一个由不受信任的 CA 颁发的证书在本次响应中被标记为已撤销,那么本次响应必须要符合下列要求。
- 必须在本次响应中说明撤销的原因。
- 必须在本次响应中说明撤销的时间。
- 不能在本次响应中包含 CRL 的参考信息。
CRL 是另一个用来查询证书状态的协议。
写在最后
OCSP 会拖慢证书的验证时间,尤其是在提供 OCSP 的服务器不那么可用的情况下,所以有了 OCSP stapling。它将验证工作放到了 Web 服务器,也就是说你在连接一个 HTTPS 站点的时候同时向站点对应的服务器发起 OCSP 请求,因为 Web 服务器对于访问它的客户端来说通常都是高可用的,所以这种方式一般比较快。本站也在写完本篇文章后支持了此种方式。
本文只是粗略地说明协议的运行过程,一些细节被省略,比如如何预防重放攻击。如果有兴趣可以自行查看协议文档。
新年快乐!
新年快乐啦,祝你心想事成哦。
实现相似功能的还有CRL,不过目前自动颁发的证书一般只有OCSP。