我不是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);
Run Code Online (Sandbox Code Playgroud)
然后我可以得到响应并在处理程序中检查它.到现在为止还挺好!
但奇怪的是,在获得SSL_CTX_set_verify处理程序后,我得到了OCSP回调.对我来说(诚然天真)的想法,这意味着我有两个选择:
1)使用CRL或自己的OCSP请求检查验证回调中的撤销状态.如果我这样做,那么在OCSP回调中做任何事都没有意义,因为我已经确定了证书的撤销状态2)不要检查验证回调中的撤销状态,并希望疯狂地认为OCSP处理程序是调用.
我注意到如果来自服务器的响应不包含装订的OCSP消息,则在验证处理程序之前调用OCSP处理程序.所以有一种可能性是我最初将某个标志'no_ocsp'设置为0,然后如果我得到没有附加消息的OCSP回调,则将其设置为1.然后在验证处理程序中我可以检查这个以尝试确定是否稍后将调用OCSP处理程序.这似乎有点像一辆汽车,当任何人接近时解锁自己,然后如果接近的人把错误的钥匙插入,它会锁定自己 - 换句话说,它肯定不是"正确"的安全方式?!
因此,我必须对如何使用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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
722 次 |
| 最近记录: |