我目前正在将一些曾经使用过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()被触发?
答案 0 :(得分:4)
通常此错误表示无法验证客户收到的响应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);
以下是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
}