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() 被触发?
通常此错误意味着您的客户端收到的服务器证书SSL_connect()无法验证。
发生这种情况的原因可能有多种:
SSL_CONTEXT.其实,你应该设置一个证书验证回调,让它接受任何证书,这样你就可以专注于连接部分。一旦它工作,只需调整您的回调或检查您的证书是否有效。
任何时候遇到失败,您都可以调用一些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)