我目前正在将一些曾经使用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上进行授权。
  • 如果服务器证书是由不在受信任的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
    }
    

    10-06 09:11
    查看更多