我目前正在将一些曾经使用 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/