我目前正在将一些曾经使用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
上进行授权。 实际上,您应该设置一个用于证书验证的回调并使其接受任何证书,因此您可以专注于连接部分。一旦工作,只需调整您的回调或检查您的证书是否有效。
任何时候如果出现故障,您都可以调用一些
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
}