c++ - 如何验证中间CA

标签 c++ c ssl openssl x509

我有到服务器的 SSL 连接。我有根 CA,它也是服务器证书。我没有客户端证书,当连接开始时,客户端会验证服务器证书以及它是否有效连接。现在我已经从我的根 CA 创建了中间 CA,并将其替换为服务器证书,现在我希望客户端验证服务器证书是否被根 CA 信任,我在 C++ 中使用 openSSL API 来完成。我该怎么做?这是我尝试过的方法,但还需要更多。

  const Char *caCert = "/home/omar/CA/host/host_rsa_key.crt";

      X509_LOOKUP *lookup = X509_STORE_add_lookup(ctx_ ->  cert_store,X509_LOOKUP_file());


      result=X509_LOOKUP_load_file(lookup,caCert,X509_FILETYPE_PEM);
      if(result != 1)
      {
        log()<<ERROR! Cannot load file to lookup structure\n";
        return;
      }


      SSL_CTX_sess_set_new_cb(ctx_, handshakeCallback);

      SSL_CTX_set_verify(ctx_, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
                         verifyCallback);
      SSL_CTX_set_verify_depth(ctx_, 8);

这是我将所有证书加载到 ssl_ctx 的地方。

我有 verifyCallback 函数,它在这里调用 verifyCertificate() 方法

  Int verifyCertificate(Int preverify, X509_STORE_CTX *store)
  {
  X509 *cert = NULL;
 // X509_NAME *name = NULL;

  SSL *ssl = NULL;

 Int certDepth = -1;
 Int certErr   = 0;

 Char *certHost = NULL;
 Char *certHash = NULL;
 Char *certData = NULL;


 cert = X509_STORE_CTX_get_current_cert(store);

 if (cert == NULL)

 log() << " ERROR! Failed to get certificate.\n";


goto VerifyCertificateError;
}



 certDepth = X509_STORE_CTX_get_error_depth(store);
 certErr = X509_STORE_CTX_get_error(store);



ssl = (SSL *) X509_STORE_CTX_get_ex_data(store, SSL_get_ex_data_X509_STORE_CTX_idx());

if (ssl == NULL)
{
 log() <<  ERROR! Failed to get SSL context from store context.\n";

 goto VerifyCertificateError;
}

if (preverify == 0)
{
//
// Self signed certificate allowed, SSH host auth style.
//

if (certErr == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT)
{

  log() << " Certificate preverify failed on self";

  return 1;
}
else if (certErr == X509_V_ERR_CERT_NOT_YET_VALID)
{

  log() << Allowing not yet valid certificate.\n";

  return 1;
 }
 else if (certErr == X509_V_ERR_CERT_HAS_EXPIRED)
 {

  log() << " Allowing expired certificate.\n";


  return 1;
}
else if(certErr == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT)
{

  log()<<" Unable to get issuer cert.\n"


  return 1;
}


if (certDepth == 0)
{
 if (parseCertificate(store, certHost, certHash, certData) == 0)
 {
   log() << "Encryptable: ERROR! Failed to parse certificate.\n";
  goto VerifyCertificateError;
}


  goto VerifyCertificateError;
}


if (authCallback_(certHost, certHash, certData, certCallback_,
                      callbackParameter_) == 0)
 {

  log() << " ERROR! Failed to authorize "
        << "the server certificate.\n";

  goto VerifyCertificateError;


if (certData != NULL)
{
  delete [] certData;
}

return 0;
}

最佳答案

中间证书由 OpenSSL 检查,您无需执行任何特殊操作。 当然

  • 您仍然需要指定您的信任 anchor (您这样做)
  • 对端必须在握手中提供中间证书

您不需要 verify_callback,因为默认回调已经进行了验证,即它会检查整个信任链,包括中间证书。如果您仍然使用一个,preverify 包含 OpenSSL 已经执行的检查结果,并且您的验证回调应该只返回此值,除非您在特定情况下需要不同的验证行为。

关于c++ - 如何验证中间CA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27355541/

相关文章:

c - 试图理解 : invalid operands to to binary expression, C

codeigniter - 如何在 Codeigniter 中配置 SparkPost SMTP?

objective-c - SSL 的问题或我对它的误解

C语言If语句

C++输出流运算符<<()中的字符何时加宽?

c++ - 如何处理浮点计算中的超精度?

c++ - Visual C++ 中的预处理器工具 __COUNTER__

c++ - 了解 C/C++ 中函数调用的堆栈框架?

php - 如何将多个 ssl 证书添加到 php.ini 中的 curl.cainfo?

c++ - 当我使用函数指针变量消失