Обычно эта ошибка означает, что сертификат сервера, полученный вашим клиентом в ответ на 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
}