The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"libssl: проверка сертификата сервера"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Библиотеки, функции)
Изначальное сообщение [ Отслеживать ]

"libssl: проверка сертификата сервера"  +/
Сообщение от InfinityNsu email(ok) on 09-Дек-10, 12:27 
Здравствуйте!

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

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

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "libssl: проверка сертификата сервера"  +/
Сообщение от InfinityNsu email(ok) on 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) *. Как его дальше проверять?

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "libssl: проверка сертификата сервера"  +/
Сообщение от InfinityNsu email(ok) on 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, узнала много нового, но никак не могу найти как решать именно эту задачу :( .

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "libssl: проверка сертификата сервера"  +/
Сообщение от guest email(??) on 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);
}

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "libssl: проверка сертификата сервера"  +/
Сообщение от InfinityNsu email(ok) on 09-Дек-10, 17:04 
> В моем разумение проверка факта, что представленный сертификат подписан доверенным CA

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

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

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру