我不是 OpenSSL 专家,但我一直在尝试编写一些代码来处理连接到 SSL 安全服务器的客户端的 OCSP 装订。我对 OCSP 的理解是,它是用来证明所出示的证书没有被吊销的,这意味着我不需要处理管理颁发者发布的 CRL。
我使用 SSL_CTX_set_verify 设置回调以处理证书验证(嗯,处理 OpenSSL 自己的内部验证过程的异常。我假设,但找不到肯定的证据证明这个内部过程不检查证书的吊销状态),目前我的代码利用这个机会来检查发行者是否受信任(或者如果不是,那么发行者的发行者是受信任的,依此类推,直到链受信任或被拒绝),以及证书未过期等其他事项. (这也可能已经检查过了,但这对我的问题并不重要)。
我修改了我的代码,添加
SSL_set_tlsext_status_type(<the ssl object>, TLSEXT_STATUSTYPE_ocsp);
SSL_CTX_set_tlsext_status_cb(<the context>, ssl_cb_ocsp_verify);
然后我可以得到响应并在处理程序中检查它。到目前为止,一切都很好!
但奇怪的是,在获得 SSL_CTX_set_verify 处理程序后,我得到了 OCSP 回调。对于我(诚然天真的)想法,这意味着我有两个选择:
1)在验证回调中检查撤销状态,使用 CRL,或者做我自己的 OCSP 请求。如果我这样做,那么在 OCSP 回调中做任何事情都没有意义,因为我已经确定了证书的吊销状态 2) 不要在验证回调中检查吊销状态,并疯狂地希望 OCSP 处理程序是叫。
我确实注意到,如果来自服务器的响应不包含装订的 OCSP 消息,则在验证处理程序之前调用 OCSP 处理程序。所以一种可能性是我最初将某个标志“no_ocsp”设置为 0,然后如果我得到没有附加消息的 OCSP 回调,则将其设置为 1。然后在验证处理程序中,我可以检查它以尝试确定稍后将调用 OCSP 处理程序。这看起来有点像一辆在任何人靠近时自动解锁的汽车,然后如果靠近的人插入错误的钥匙,它就会自动锁定——换句话说,它肯定不是做安全的“正确”方式吗?!
因此,我必须对如何使用 OCSP、OpenSSL 或两者都有一些基本的误解!我究竟做错了什么?
(我已经看到了类似的问题,这些问题解释了如何获取OCSP 装订的消息,但我的问题与您如何以合理的方式实际使用它有关,考虑到回调的顺序。要清楚:我可以在没有 OCSP_RESPONSE 的情况下获得任何问题)