C++ SSL_connect()生成证书验证失败
我目前正在将一些曾经使用RSA Security库的现有技术重写到OpenSSL中,但我开始遇到一些问题。目前,所有证书验证代码似乎都在顺利运行,直到我调用SSL_connect() 在此之前,对SSL\u connect()的调用将产生SSL\u ERROR\u WANT\u READ 另一个论坛对此问题的回答向我建议,应该调用SSL_connect(),直到它停止产生SSL_ERROR_WANT_READ错误。不幸的是,这只会产生更令人困惑的东西:C++ SSL_connect()生成证书验证失败,c++,openssl,sockets,C++,Openssl,Sockets,我目前正在将一些曾经使用RSA Security库的现有技术重写到OpenSSL中,但我开始遇到一些问题。目前,所有证书验证代码似乎都在顺利运行,直到我调用SSL_connect() 在此之前,对SSL\u connect()的调用将产生SSL\u ERROR\u WANT\u READ 另一个论坛对此问题的回答向我建议,应该调用SSL_connect(),直到它停止产生SSL_ERROR_WANT_READ错误。不幸的是,这只会产生更令人困惑的东西: error:14090086:SSL ro
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
即使SSL_CTX_load_verify_locations()成功。有人知道为什么验证错误不会注册到证书方法并等待触发SSL_connect()吗 通常,此错误意味着无法验证客户端在响应
SSL\u connect()
时收到的服务器证书
发生这种情况的原因可能不同:
- 如果服务器证书是自签名的,则必须在
SSL\u上下文中对其进行授权
- 如果服务器证书由不在受信任CA证书列表中的证书颁发机构签名
- 如果服务器证书尚未生效或不再有效
SSL\u get\u 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);
以下是InternalCertificateReferenceCallback
的定义:
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
}
谢谢你的回复,但我想我还是有点困惑。我如何“接受任何证书”?我尝试在我的SSL\u CTX\u set\u VERIFY()方法调用中使用SSL\u VERIFY\u NONE,但我认为这不是我想要的路线。另外,如何将回调附加到SSL_CTX_load_verify_locations()调用?我以为它不接受回调函数。呃,至少在C++~@kelly.dunn中是这样的:我添加了一些可能会有所帮助的代码示例。我不理解你关于回调函数和
C++
的评论:你可以在C++
中编写和使用C
回调,没有任何问题。只需小心指定函数或静态方法,而不是方法(由于隐藏的此参数,它们的签名不同)。哦,我只是对您要在何处附加回调函数感到困惑~我忘了SSL_set_verify()接受一个作为其最终参数。谢谢!我将很快实施此功能,看看它是否有帮助:D@kelly.dunn:如果我的答案满足你的需要,别忘了接受;)我错了,我太忙了。谢谢你的帮助