Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SSL_connect()生成证书验证失败_C++_Openssl_Sockets - Fatal编程技术网

C++ SSL_connect()生成证书验证失败

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

我目前正在将一些曾经使用RSA Security库的现有技术重写到OpenSSL中,但我开始遇到一些问题。目前,所有证书验证代码似乎都在顺利运行,直到我调用SSL_connect()

在此之前,对SSL\u connect()的调用将产生SSL\u ERROR\u WANT\u 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\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:如果我的答案满足你的需要,别忘了接受;)我错了,我太忙了。谢谢你的帮助