c++ - SSL_connect() 产生证书验证失败

标签 c++ openssl sockets

我目前正在将一些曾经使用 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() 被触发?

最佳答案

通常此错误意味着您的客户端收到的响应 SSL_connect() 的服务器证书无法验证。

这可能由于不同的原因而发生:

  • 如果服务器证书是自签名的,则您必须在 SSL_CONTEXT 上对其进行授权。
  • 如果服务器证书是由不在可信 CA 证书列表中的证书颁发机构签署的
  • 如果服务器证书尚未生效或不再有效

实际上,你应该设置一个证书验证的回调,让它接受任何证书,这样你就可以专注于连接部分。一旦成功,只需调整您的回调或检查您的证书是否有效。

任何时候遇到失败,您都可以调用一些 SSL_get_error() 函数,它会告诉您证书被拒绝的原因。

(不幸的是,我现在无法访问我的代码库,所以我无法给出具体示例)


以下是我自己的 SSL 套接字包装器类中的一些代码示例,已为您改编:

// 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
}

关于c++ - SSL_connect() 产生证书验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3298054/

相关文章:

Java HTTP/2 服务器套接字

c++ - 使用 Crypto++ 将签名从 P1363 转换为 ASN.1/DER 格式?

java - 如何使用 java 解码用 openssl aes-128-cbc 编码的字符串?

c++ - 使用 union 数组中的数据初始化 std::vector

ruby-on-rails - OpenSSL::SSL::SSLError Homebrew OpenSSL 握手失败

c - C 中重复 SSL_connect 导致 SIGSEGV

sockets - 什么是 Erlang 最好、最有效的客户端池技术

php - Socket_read() 说 "not a valid resource"

c++ - 同步 MATLAB 和 C++

c++ - 模板转发对成员方法的调用