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

mik*_*ail 3 c ssl openssl ocsp certificate

我有一个嵌入式C客户端程序,使用OpenSSL安全地连接到服务器.服务器在握手期间提供证书,客户端必须检查此证书的撤销状态.目前我通过使用OCSP来做到这一点.

所有这些都有效,但现在我需要使用OCSP装订重新实现客户端的吊销检查(假设服务器将开始提供此功能).

目前我使用服务器证书X509 *cert = SSL_get_peer_certificate(ssl)来检查subjectAltName我服务器的域并获取authorityInfoAccess(对于OCSP URI).

假设我有一个SSL * ssl;并且我成功设置了所有内容并通过连接SSL_connect(ssl);,此时我该怎么做以获取OCSP装订信息并验证我刚收到的证书?我找不到任何有关如何使用OpenSSL库实际实现此示例的示例代码.

Jum*_*ram 5

有几个步骤:

  1. 让客户端status_request通过发送扩展SSL_set_tlsext_status_type(ssl, TLSEXT_STATUSTYPE_ocsp).

  2. 注册一个回调(和参数)以通过SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb)和检查OCSP响应SSL_CTX_set_tlsext_status_arg(ctx, arg)

  3. 编写回调函数.使用的那个s_client演示如何获取响应信息:

    static int ocsp_resp_cb(SSL *s, void *arg)
    {
    const unsigned char *p;
    int len;
    OCSP_RESPONSE *rsp;
    len = SSL_get_tlsext_status_ocsp_resp(s, &p);
    BIO_puts(arg, "OCSP response: ");
    if (!p)
        {
        BIO_puts(arg, "no response sent\n");
        return 1;
        }
    rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
    if (!rsp)
        {
        BIO_puts(arg, "response parse error\n");
        BIO_dump_indent(arg, (char *)p, len, 4);
    return 0;
    }
    BIO_puts(arg, "\n======================================\n");
    OCSP_RESPONSE_print(arg, rsp, 0);
    BIO_puts(arg, "======================================\n");
    OCSP_RESPONSE_free(rsp);
    return 1;
    }
    
    Run Code Online (Sandbox Code Playgroud)