简介
咱们在进行网页拜访的时候会跟各种各样的证书打交道,比方在拜访https网页的时候,须要检测https网站的证书有效性。
OCSP就是一种校验协定,用于获取X.509数字证书的撤销状态。它是为了替换CRL而呈现的。
本文将会具体介绍OCSP的实现和长处。
PKI中的CRL
咱们晓得在PKI架构中,CA证书是十分重要的组件,客户端通过CA证书来验证服务的可靠性。对于CA证书自身来说在创立的时候是能够指定过期工夫的。这样证书在过期之后就不能够应用,须要申请新的证书。
然而只给证书指定过期工夫是不够的,比方咱们因为业务的需要,须要撤销证书怎么办呢?
PKI中提供了一个叫做CRL(certificate revocation list)的机制,用来维持被破除的证书列表。
这个CRL是由CA来颁发的,个别是在证书过期之前生成的。因为如果证书曾经过期了,那么这个CRL是无意义的。
对于CRL自身来说,它是一个证书列表,外面证书的格局通常也应用的是X.509。
CRL个别是由公布证书的CA来保护和公布的,公布CRL的组件叫做CRL issuer,通常来说CRL issuer和CA是同一个服务,然而你也能够依据须要将CRL issuer和CA进行拆分。
CRL是由CA定时来公布的,当然你也能够依照须要在须要撤销某个CA证书的时候从新公布CRL。所有的CRL都有过期工夫,在这个过期工夫之内,客户端能够依据CRL中的签名,去CA验证CRL的有效性,从而避免CRL的伪造。
CRL的毛病
那么CRL有什么毛病呢?
首先CRL维持的是一个撤销的证书列表,为了保证系统的有效性,客户端在每次校验CA证书有效性的时候,都须要从CA服务器中获取这个CRL。而后通过CRL来校验对应的CA证书状态。
如果每次都去拿这个CRL,就有可能会有上面几个问题。
第一个问题是,如果CRL不可用,那么客户端就拿不到这个CRL,也就无奈校验CA证书的状态,从而造成服务不可用。
另外一个问题是,如果要撤销的证书比拟多的话,这个CRL可能会比拟大,从而造成网络资源的节约。
最初一个问题是PKI证书体系自身的目标是建设一个能够自我校验的,不依赖于在线服务的平安体系,如果每次都要在线获取CRL的话,就是去了PKI的这一劣势。
CRL的状态
尽管CRL维持的是一个撤销证书列表,然而这个列表中证书的状态还是有所不同的。
CRL中证书的状态有两种,第一种就是证书曾经被撤销了,比方证书的颁发机构CA发现之前的颁布的证书是谬误的,或者因为其余的起因如私钥泄露导致原来的证书不够平安,须要将证书撤回。或者证书机构因为未恪守某些策略导致证书被撤消等,都须要将之前的证书设置为撤销状态。
还有一种状态是一个长期撤销的状态,这里叫做Hold状态,它示意证书临时是有效的,比方在用户没有确定私钥是否失落的状况下。当用户最终找回了私钥,则这个证书还是能够被复原的。
OCSP的工作流程
既然CRL有这么多毛病,所以一个用来代替CRL的OCSP协定呈现了。
咱们先来看一下OCSP的工作流程。
如果A和B要进行应用PKI进行通信。为了保障通信的安全性,A将本人的公钥发给B,并通知B,这是我的公钥,你能够用这个公钥来校验我发送给你的音讯。
B在收到A的公钥之后,并不能确定A的公钥就是正确的,没有被篡改的。于是从A的公钥中提取出serial number,并将其封装到一个'OCSP request'中发给CA服务器。
CA服务器中的OCSP responder读取到了'OCSP request'申请,并从中提取出A的公钥的serial number。OCSP responder从CA服务器的数据库中查问这个serial number是否在这个数据库被撤销的列表中。
如果发现不在,那么意味着A的公钥依然是无效的,OCSP responder将会发送一个签名后的OCSP response给B。
B通过应用CA服务器的公钥验证OCSP response的有效性,从而确认A的公钥依然无效 。
最初B应用A的公钥和A进行通信。
OCSP的长处
从下面的OCSP的工作流程咱们能够大略总结出上面几个OCSP绝对于CRL的长处。
首先OCSP响应的数据量要比CRL要小,所以对网络的要求和压力更少。
另外因为OCSP响应要解析的数据更少,所以OCSP客户端的实现要比CRL更加简略。
尽管因为CRL的各种毛病,在web环境中曾经不再被应用,而是被更加高效的OCSP替换,然而CRL依然被运行在CA的其余环境中。
OCSP协定的细节
OCSP协定是在RFC 6960中定义的。
OCSP协定能够分为申请协定和响应协定两局部,接下来别离来进行介绍。
OCSP申请
一个OCSP申请须要蕴含协定版本号,申请服务,要校验的证书identifier和可选的扩大局部。
OCSP responder在接管到OCSP的申请之后,会去校验OCSP音讯的有效性,如果音讯有问题则会返回异样,否则的话会依据申请的服务进行解决。
OCSP申请如果用ASN.1(Abstract Syntax Notation One)形象语法标记这能够如下示意:
OCSPRequest ::= SEQUENCE { tbsRequest TBSRequest, optionalSignature [0] EXPLICIT Signature OPTIONAL } TBSRequest ::= SEQUENCE { version [0] EXPLICIT Version DEFAULT v1, requestorName [1] EXPLICIT GeneralName OPTIONAL, requestList SEQUENCE OF Request, requestExtensions [2] EXPLICIT Extensions OPTIONAL } Signature ::= SEQUENCE { signatureAlgorithm AlgorithmIdentifier, signature BIT STRING, certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL} Version ::= INTEGER { v1(0) } Request ::= SEQUENCE { reqCert CertID, singleRequestExtensions [0] EXPLICIT Extensions OPTIONAL } CertID ::= SEQUENCE { hashAlgorithm AlgorithmIdentifier, issuerNameHash OCTET STRING, -- Hash of issuer's DN issuerKeyHash OCTET STRING, -- Hash of issuer's public key serialNumber CertificateSerialNumber }
ASN.1是一个接口描述语言,通过ASN.1,咱们能够很清晰的形容数据的格局信息。
一个OCSPRequest是由可抉择签名的OCSP申请tbsRequest和对应的签名optionalSignature组成的。
其中TBSRequest中蕴含了版本号,OCSP requestor的名字,证书的状态列表requestList,可选的扩大数据这几项组成的。
OCSP响应
对于OCSP的响应来说,依据传输协定的不同它的构造也是不同的。然而所有的响应都应该蕴含responseStatus字段示意申请的解决状态。
OCSP响应用ASN.1格局来示意如下所示:
OCSPResponse ::= SEQUENCE { responseStatus OCSPResponseStatus, responseBytes [0] EXPLICIT ResponseBytes OPTIONAL } OCSPResponseStatus ::= ENUMERATED { successful (0), -- Response has valid confirmations malformedRequest (1), -- Illegal confirmation request internalError (2), -- Internal error in issuer tryLater (3), -- Try again later -- (4) is not used sigRequired (5), -- Must sign the request unauthorized (6) -- Request unauthorized } ResponseBytes ::= SEQUENCE { responseType OBJECT IDENTIFIER, response OCTET STRING }
responseStatus是响应的状态,responseBytes是可选的响应后果。
这里的response是一个BasicOCSPResponse对象的DER编码:
BasicOCSPResponse ::= SEQUENCE { tbsResponseData ResponseData, signatureAlgorithm AlgorithmIdentifier, signature BIT STRING, certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL }
OCSP stapling
能够看到OCSP须要客户在须要查看证书是否被撤消的时候,须要向OCSP responser申请,以确认证书的有效性。
然而这种形式实际上泄露了用户的隐衷信息,因为OCSP responser晓得了客户端须要校验的证书,就晓得客户端正在拜访的网站。
于是引入了OCSP stapling来解决这个问题。
那么什么是OCSP stapling呢?
OCSP stapling是间接将OCSP证书放到客户端要拜访的web服务器上,因为OCSP证书是增加了工夫戳和数字签名的,所以能够保障其正确性。
这些OCSP证书会在客户端和web端建设SSL 握手的时候就蕴含在OCSP响应中。
这样客户端不须要独自和CA建设额定的连贯,从而进步了性能。
OCSP stapling须要在服务器端被动开启。
如果你用的是apache服务器,首先须要版本大于2.3.3。
而后须要在.conf文件中的<VirtualHost></VirtualHost>
block内部增加:
SSLStaplingCahe shmcb: /tmp/stapling_cache(128000)
而后在<VirtualHost></VirtualHost>
block的外部增加:
SSLUseStapling On
如果你用的是nginx,首先须要版本大于1.3.7。
而后在nginx的配置文件server {}
block中增加:
ssl_stapling on;ssl_stapling_verify on;
如果你想验证一个网站是否开启了OCSP stapling,能够到https://entrust.ssllabs.com/网站中进行查问:
在这个网站中,你能够输出任何要查问的网站地址,而后能够失去上面的信息:
能够看到这个网站是开启了OCSP stapling的。
总结
OCSP和OCSP stapling是十分有用的证书撤销校验协定,曾经被宽泛的应用。大家能够检查一下本人的网站有没有用到哦。
更多内容请参考 http://www.flydean.com/43-pki-ocsp/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」,懂技术,更懂你!