Проверка отзыва сертификата OpenSSL в клиентской программе с использованием сшивания OCSP - PullRequest
3 голосов
/ 07 марта 2012

У меня есть встроенная клиентская программа C, которая безопасно подключается к серверу с использованием OpenSSL. Сервер предоставляет свой сертификат во время рукопожатия, и клиент должен проверить статус отзыва этого сертификата. В настоящее время я делаю это с помощью OCSP.

Все это работает, но теперь мне нужно повторно реализовать проверку отзыва клиента, используя OCSP сшивание (при условии, что сервер начнет предоставлять это).

В настоящее время я получаю сертификат сервера, используя X509 *cert = SSL_get_peer_certificate(ssl), чтобы проверить subjectAltName в домене моего сервера и получить authorityInfoAccess (для URI OCSP).

Если у меня есть SSL * ssl;, и я успешно все настроил и подключил через SSL_connect(ssl);, что мне делать в этот момент, чтобы получить информацию о сшивании OCSP и проверить только что полученный сертификат? Я не могу найти пример кода для того, как на самом деле реализовать это с помощью библиотеки OpenSSL.

1 Ответ

5 голосов
/ 21 июля 2012

Существует несколько шагов:

  1. Пусть клиент отправит добавочный номер status_request через SSL_set_tlsext_status_type(ssl, TLSEXT_STATUSTYPE_ocsp).

  2. Зарегистрировать обратный вызов(и аргумент) для изучения ответа OCSP с помощью SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb) и 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;
    }
    
...