SSL_connect()产生证书验证失败

时间:2010-07-21 09:58:02

标签: c++ openssl sockets

我目前正在将一些曾经使用过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()被触发?

1 个答案:

答案 0 :(得分:4)

通常此错误表示无法验证客户收到的响应SSL_connect()的服务器证书。

这可能由于不同原因而发生:

  • 如果服务器证书是自签名的,则必须在SSL_CONTEXT上对其进行授权。
  • 如果服务器证书由不在可信CA证书列表中的证书颁发机构签名
  • 如果服务器证书尚未生效或不再有效

实际上,您应该为证书验证设置回调并使其接受任何证书,这样您就可以专注于连接部分。一旦它工作,只需调整您的回调或检查您的证书是否有效。

在任何时候出现故障,您可以调用一些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
}