2012-03-07 92 views
3

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

所有这些工作,但现在我需要重新实施客户的吊销检查使用OCSP stapling(假设服务器将开始提供此)。

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

假设我有一个SSL * ssl;,并且我已成功设置所有内容并通过SSL_connect(ssl);进行连接,那么现在我在做什么来获取OCSP装订信息并验证刚收到的证书?我找不到任何示例代码来说明如何使用OpenSSL库实际实现此功能。

回答

5

有几个步骤:

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

  2. 注册一个回调(和参数)审查通过SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb)SSL_CTX_set_tlsext_status_arg(ctx, arg)

  3. 的OCSP响应写回调函数。通过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; 
    }