OpenSSL игнорировать ошибку самоподписанного сертификата - PullRequest
11 голосов
/ 13 февраля 2010

Я пишу небольшую программу с библиотекой OpenSSL, которая должна устанавливать соединение с сервером SSLv3. Этот сервер выдает самозаверяющий сертификат, что приводит к сбою рукопожатия с таким сообщением: «Ошибка рукопожатия sslv3 alert, самоподписанный сертификат в цепочке сертификатов».

Есть ли способ заставить соединение установиться? Я пытался вызвать SSL_CTX_set_verify так:

SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);

Но, похоже, это ничего не меняет.

Есть предложения?

Ответы [ 6 ]

4 голосов
/ 22 октября 2013

По умолчанию OpenSSL обходит цепочку сертификатов и пытается проверять на каждом шаге, SSL_set_verify() не меняет этого, см. Справочную страницу. Цитирую это:

Фактическая процедура проверки выполняется с использованием встроенная процедура проверки или использование другого приложения функция проверки установлена ​​с помощью SSL_CTX_set_cert_verify_callback (3).

Таким образом, решение состоит в том, чтобы создать простой обратный вызов и установить его так, чтобы вы переопределяли все обходы цепочки сертификатов:

static int always_true_callback(X509_STORE_CTX *ctx, void *arg)
{
    return 1;
}

SSL_CTX_set_cert_verify_callback(CTX, always_true_callback);
2 голосов
/ 18 февраля 2010

Проверьте эти примеры OpenSSL: http://www.rtfm.com/openssl-examples/

wclient.c подключается к любой странице https, например:

wclient -h www.yahoo.com -p 443

Если вы запустите его с установкой по умолчанию, вы получите ошибку сертификата (хотя вы можете использовать флаг -i, чтобы обойти проверку сертификата).

Чтобы проверить сертификат, вам необходимо загрузить сертификаты CA (Verisign, Thawte, Equifax и т. Д.), Поэтому поищите в этом файле cacert.pem , загрузите и переименуйте его в root .pem и вы сможете подключиться к веб-серверу и проверить его сертификат.

2 голосов
/ 13 февраля 2010

Вы пытались предоставить вашему приложению сертификат CA для сервера, чтобы ваше приложение могло проверить цепочку сертификатов?

0 голосов
/ 09 мая 2010

Мой пример клиентского кода ( ссылка ) отлично работает с самозаверяющим сертификатом сервера. У меня есть приведенный ниже код после SSL_connect, и я полностью контролирую приемлемость самозаверяющих сертификатов в моем клиенте

SSL_CTX* ctx = SSL_CTX_new(SSLv3_method());

// TCP connection and SSL handshake ...

/* Check the certificate */

rc = SSL_get_verify_result(ssl);
if(rc != X509_V_OK) {
  if (rc == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT || rc == X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN) {
    fprintf(stderr, "self signed certificate\n");
  }
  else {
    fprintf(stderr, "Certificate verification error: %ld\n", SSL_get_verify_result(ssl));
    SSL_CTX_free(ctx);
    return 0;
  }
}
0 голосов
/ 13 февраля 2010

Вы можете попробовать передать свой собственный обратный вызов на SSL_set_verify(), а затем выполнить собственную проверку. Это менее чем идеально, так как я думаю, что вам необходимо выполнить всю проверку и затем позволить игнорировать самозаверяющую ошибку, но вы должны быть в состоянии выяснить, что делает стандартный код проверки из исходного кода OpenSSL, а затем просто извлечь его. в свой собственный обратный вызов проверки и разрешить конкретный код ошибки ...

0 голосов
/ 13 февраля 2010

Вы пытались установить SSL_set_verify?

SSL_set_verify(s, SSL_VERIFY_NONE, NULL);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...