SSL_connect () выдает ошибку проверки сертификата - PullRequest
3 голосов
/ 21 июля 2010

В настоящее время я переписываю некоторые существующие технологии, которые когда-то использовали библиотеки RSA Security, в OpenSSL, но я начинаю сталкиваться с несколькими проблемами.В настоящее время весь код проверки сертификата работает без перебоев, пока я не вызову SSL_connect ().

До этого вызов SSL_connect () приводил к SSL_ERROR_WANT_READ.

Ответ на этот вопрос на другом форуме предложил мне вызывать SSL_connect () до тех пор, пока он не перестанет выдавать ошибки SSL_ERROR_WANT_READ.К сожалению, это только приводит к чему-то более запутанному:

error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

, даже если SSL_CTX_load_verify_locations () завершается успешно.Кто-нибудь имеет представление о том, почему ошибка проверки не будет регистрироваться с помощью методов сертификата и ждать, пока SSL_connect () не будет запущен?

1 Ответ

4 голосов
/ 21 июля 2010

Обычно эта ошибка означает, что сертификат сервера, полученный вашим клиентом в ответ на SSL_connect(), невозможно проверить.

Это может произойти по разным причинам:

  • Если сертификат сервера самоподписан, вам нужно будет авторизовать его на своем SSL_CONTEXT.
  • Если сертификат сервера был подписан центром сертификации, которого нет в списке доверенных сертификатов CA
  • Если сертификат сервера еще не действителен или больше не действителен

На самом деле, вы должны установить обратный вызов для проверки сертификата и заставить его принимать любой сертификат, чтобы вы могли сосредоточиться на части соединения. Как только это сработает, просто настройте обратный вызов или проверьте действительность ваших сертификатов.

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

(К сожалению, сейчас я не могу получить доступ к своей базе кода, поэтому не могу привести конкретные примеры)


Вот несколько примеров кода из моего собственного класса оболочки SSL Socket, адаптированного для вас:

// ctx is a SSL_CONTEXT
// internalCertificateVerificationCallback is a callback static method (or function)
ctx->setVerify(SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, internalCertificateVerificationCallback);

Вот определение для internalCertificateVerificationCallback:

int SecureSocket::internalCertificateVerificationCallback(int preverify_ok, X509_STORE_CTX* x509_ctx)
{
  //preverify_ok contains 1 if the pre-verification succeeded, 0 otherwise.

  return 1; // This accepts every certificate
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...