2012-03-07 128 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; 
    }