#此文来自于知乎的匿名用户
要想验证证书是否有效,要检查三点:
1. 验证证书是否在有效期内。
证书中会包含证书的有效期的起始时间和结束时间,取一个时间点去比较就好了。
关键问题是如何保证取到的时间点是可信的,这就是另外一个话题了。
2. 验证证书是否被吊销了。
被吊销的证书是无效的。
验证吊销有CRL和OCSP两种方法。
CRL即证书吊销列表。证书被吊销后会被记录在CRL中,CA会定期发布CRL。应用程序可以依靠CRL来检查证书是否被吊销了。
CRL有两个缺点,一是有可能会很大,下载很麻烦。针对这种情况有增量CRL这种方案。 二是有滞后性,就算证书被吊销了,应用也只能等到发布最新的CRL后才能知道。增量CRL也能解决一部分问题,但没有彻底解决。
OCSP是在线证书状态检查协议。应用按照标准发送一个请求,对某张证书进行查询,之后服务器返回证书状态。OCSP可以认为是即时的(实际实现中可能会有一定延迟),所以没有CRL的缺点。不过对于一般的应用来说,实现OCSP还是有些难度的。
3. 验证证书是否是上级CA签发的。
每一张证书都是由上级CA证书签发的,上级CA证书可能还有上级,最后会找到根证书。根证书即自签证书,自己签自己。 当你验证一张证书是否是由上级CA证书签发的时候,你必须有这张上级CA证书。通常这张证书会内置在浏览器或者是操作系统中,有些场景下应用系统也会保留。
——— 以上三点,只要有一个没通过,这张证书就是无效的,不该信任。 在实际场景中会衍生出一些问题,
比如: 1. 严格来说,证书状态验证“应该”是个“递归”过程:验证完一张证书之后还得验证上级CA证书,一直验到根。这个开销太巨大了,所以应用系统大多会做一些取舍。当然乱取舍的时候就有可能出问题。 2. 根证书的可信程度。根证书是整个信任体系的“根”,只有根证书可信,下级证书才可信。