openssl - 为什么在验证回调之后调用 OCSP 装订回调?

标签 openssl ocsp

我不是 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 处理程序将在稍后调用。这有点像一辆汽车在任何人靠近时自动解锁,然后如果靠近的人把错误的 key 放进去,它就会锁上自己——换句话说,这肯定不是确保安全的“正确”方式?!

因此,我必须对如何使用 OCSP、OpenSSL 或两者都有一些根本的误解!我究竟做错了什么?

(我看到过类似的问题,这些问题解释了如何获取 OCSP 装订的消息,但我的问题与您如何以合理的方式实际使用它有关,考虑到回调的顺序。要清楚的是:我可以获得 OCSP_RESPONSE 没有任何问题)

最佳答案

第三种选择是请求 CRL 点和 OCSP 回复,然后以正确的顺序验证自己。

您可以使用 OCSP_basic_verify 在回调中验证 OCSP 装订回复。然后,一旦建立连接,您就可以通过以下方式检查 CRL

X509_STORE_CTX* ctx = ...

// fill up ctx, if not yet initialized
ctx->chain = chain;
ctx->get_crl = []( X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x ) -> int
{ .. your method to download CRL .. }
// disable additional CRL lookup by the library
ctx->lookup_crls = [] (X509_STORE_CTX *ctx, X509_NAME *nm) ->STACK_OF( X509_CRL ) * { return nullptr; };
// other possible options are: X509_V_FLAG_EXTENDED_CRL_SUPPORT, X509_V_FLAG_CRL_CHECK_ALL, X509_V_FLAG_USE_DELTAS
ctx->param->flags = X509_V_FLAG_CRL_CHECK;

// this will evaluate how well the CRL fits the leaf certificate you want to validate
ctx->check_revocation(ctx);

// this validates the CRL itself, if it is signed and stuff
// 0 - bad
// 1 - okay
int ok = ctx->check_crl(ctx, m_crl);

//  This gives actual revocation result
// 0 - bad (ctx->error = X509_V_ERR_CERT_REVOKED or something else)
// 1 - okay
// 2 - CRL_REASON_REMOVE_FROM_CRL
int result = ctx->cert_crl(ctx, m_crl, leafCertificate);

关于openssl - 为什么在验证回调之后调用 OCSP 装订回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23390964/

相关文章:

c++ - RSA 公钥加密 openssl

c# - 使用 CA 证书文件验证远程服务器 X509Certificate

openssl - 如何使用 openssl 和给定的公钥加密小文本

android - 如何在 Android/Linux 上构建 OpenSSL?

c - 使用 OCSP 装订在客户端程序中进行 OpenSSL 证书吊销检查

ssl - 证书撤销列表 (CRL) 存储在哪里?

ssl - 为什么我会收到验证错误 :unable to get local issuer certificate when I run openssl ocsp?

c - 如何为 EVP_CIPHER 设置零填充?

validation - 没有颁发者证书的 OCSP 验证

pdf - OCSP 响应解析错误。 BER解码出错