URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8958
[ Назад ]

Исходное сообщение
"libssl: проверка сертификата сервера"

Отправлено InfinityNsu , 09-Дек-10 12:27 
Здравствуйте!

Как проверить сертификат сервера (т. е. убедиться, что сервер именно тот, за кого себя выдает) с использование libssl? Например, есть проверка клиентских сертификатов с помощью корневых, делается так:
SSL_CTX_set_verify() - выставляем коллбэк
SSL_CTX_set_verify_depth()
SSL_load_client_CA_file() - грузим файлик с CA сертификатами, которыми потом проверяем клиентские сертификаты.

Как сделать то же самое с точки зрения клиента?


Содержание

Сообщения в этом обсуждении
"libssl: проверка сертификата сервера"
Отправлено guest , 09-Дек-10 13:31 
> SSL_CTX_set_verify() - выставляем коллбэк
> SSL_CTX_set_verify_depth()
> SSL_load_client_CA_file() - грузим файлик с CA сертификатами, которыми потом проверяем
> клиентские сертификаты.

SSL_get_peer_cert_chain()
Остальное тоже самое.


"libssl: проверка сертификата сервера"
Отправлено InfinityNsu , 09-Дек-10 14:04 
>> SSL_CTX_set_verify() - выставляем коллбэк
>> SSL_CTX_set_verify_depth()
>> SSL_load_client_CA_file() - грузим файлик с CA сертификатами, которыми потом проверяем
>> клиентские сертификаты.
> SSL_get_peer_cert_chain()
> Остальное тоже самое.

А можно чуть поподробнее? Я так понимаю SSL_get_peer_cert_chain надо звать внутри verify коллбека? Получим STACK_OF(X509) *. Как его дальше проверять?


"libssl: проверка сертификата сервера"
Отправлено guest , 09-Дек-10 15:28 
> А можно чуть поподробнее? Я так понимаю SSL_get_peer_cert_chain надо звать внутри verify
> коллбека? Получим STACK_OF(X509) *. Как его дальше проверять?

вообще если вам нужно только валиден/не валиден то можно сделать проще SSL_get_peer_certificate() и SSL_get_verify_result()


"libssl: проверка сертификата сервера"
Отправлено InfinityNsu , 09-Дек-10 15:46 
>> А можно чуть поподробнее? Я так понимаю SSL_get_peer_cert_chain надо звать внутри verify
>> коллбека? Получим STACK_OF(X509) *. Как его дальше проверять?
> вообще если вам нужно только валиден/не валиден то можно сделать проще SSL_get_peer_certificate()
> и SSL_get_verify_result()

У меня есть сервер (к которому надо коннектиться), он использует самоподписанный сертификат. Я коннекчусь к нему клиентом с использованием клиентских сертификатов, сервер убеждается что я это я, проверяя мой сертификат с помощью СА сертификата. Мне надо чтобы работало и в обратную сторону, чтобы и клиент убеждался, что он коннектиться к правильному серверу. Для этого клиенту я подсовываю CA, которым подписан сертификат сервера и с помощью этого CA я хочу проверить, что сертификат сервера подписан именно этим CA. В общем, задача установления безопасного соединения в обе стороны, поэтому проверить просто валидность сертификата сервера недостаточно.
Пыталась найти примеры кода или хавтушку, как это сделать, но не нашла ничего. только проверка клиентов :( . По документации толком непонятно, с какой стороны смотреть, изучаю сорцы openssl, узнала много нового, но никак не могу найти как решать именно эту задачу :( .


"libssl: проверка сертификата сервера"
Отправлено guest , 09-Дек-10 16:44 
> Мне надо чтобы работало и в обратную сторону, чтобы и клиент
> убеждался, что он коннектиться к правильному серверу. Для этого клиенту я
> подсовываю CA, которым подписан сертификат сервера и с помощью этого CA
> я хочу проверить, что сертификат сервера подписан именно этим CA. В
> общем, задача установления безопасного соединения в обе стороны, поэтому проверить просто
> валидность сертификата сервера недостаточно.

Что-то я вас не понимаю.
В моем разумение проверка факта, что представленный сертификат подписан доверенным CA и common name указанный в сертификате совпадает с хостом к которому мы конектимся и является признаком валидности сертификата.
т.е. примерно так:

int
check_ssl_certificate(SSL *conn, const char *host)
{
    X509 *cert;
    X509_NAME *xname;
    char cname[256];
    long vresult;

    if (conn == NULL)
        /* Нифига не SSL */
    cert = SSL_get_peer_certificate(conn);
    if (!cert)
        /* Нет сертификата */
    vresult = SSL_get_verify_result(conn);
    if (vresult != X509_V_OK)
        /* Громко ругаемся. */

    xname = X509_get_subject_name(cert);
    cname[0] = '\0';
    X509_NAME_get_text_by_NID(xname, NID_commonName,
        cname, sizeof(cname));

    if (!cname_match(cname, host))
        /* Нас пытались обмануть */

    /* Еще надо проверить ASN1 */

    /* Позвать *_free() */

    /* Все хорошо. */
    return (0);
}


"libssl: проверка сертификата сервера"
Отправлено InfinityNsu , 09-Дек-10 17:04 
> В моем разумение проверка факта, что представленный сертификат подписан доверенным CA

Вот меня интересует, как проверить этот момент. Я использую самоподписанные сертификаты, у меня есть СА свой собственный, которым я подписала сертификат сервера, и я хочу на стороне клиента проверить, что сертификат, полученный от сервера, подписан именно этим СА. Вопрос в том, как ему надо подсовывать нужный СА для проверки.

Извините, если торможу, но как-то этот момент для меня осталься непонятным :) .


"libssl: проверка сертификата сервера"
Отправлено guest , 09-Дек-10 17:41 
> Вот меня интересует, как проверить этот момент. Я использую самоподписанные сертификаты,
> у меня есть СА свой собственный, которым я подписала сертификат сервера,
> и я хочу на стороне клиента проверить, что сертификат, полученный от
> сервера, подписан именно этим СА. Вопрос в том, как ему надо
> подсовывать нужный СА для проверки.

Если сертификат "общесистемный" то ничего не надо, openssl сама его найдет.
если же он используется только вашим приложением и лежит в не стандартном месте, то нужно сделать SSL_CTX_load_verify_locations()


"libssl: проверка сертификата сервера"
Отправлено InfinityNsu , 09-Дек-10 19:27 
> Если сертификат "общесистемный" то ничего не надо, openssl сама его найдет.
> если же он используется только вашим приложением и лежит в не стандартном
> месте, то нужно сделать SSL_CTX_load_verify_locations()

Большое Вам спасибо за помощь! Завтра буду пробовать :) .