SSL_connect() 产生证书验证失败

kel*_*unn 4 c++ sockets openssl

我目前正在将一些曾经使用 RSA 安全库的现有技术重写到 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
Run Code Online (Sandbox Code Playgroud)

即使 SSL_CTX_load_verify_locations() 成功。有没有人知道为什么验证错误不会用证书方法注册并等到 SSL_connect() 被触发?

ere*_*eOn 5

通常此错误意味着您的客户端收到的服务器证书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);
Run Code Online (Sandbox Code Playgroud)

这是 的定义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
}
Run Code Online (Sandbox Code Playgroud)