gpt4 book ai didi

c++ - 如何使用 boost::asio SSL 验证客户端证书?

转载 作者:IT老高 更新时间:2023-10-28 22:36:27 25 4
gpt4 key购买 nike

以下是 SSL 上下文初始化和验证回调注册的代码片段。如果我使用正确的证书连接 SSL 客户端,它会验证证书并按预期工作。

但是如果我在没有任何证书的情况下连接客户端,那么它允许连接(实际上它不应该允许没有证书的连接)。如果 SSL 客户端不发送证书,则不会调用验证回调。

    boost::asio::ssl::context_base::method SSL_version =
static_cast<boost::asio::ssl::context_base::method>(param_values[ID_PROTOCOL_VERSION].int32_value);

// load certificate files
boost::shared_ptr<boost::asio::ssl::context> context_ = boost::shared_ptr<boost::asio::ssl::context>(
new boost::asio::ssl::context(SSL_version)); // parasoft-suppress BD-RES-LEAKS "The memory is allocated via boost::shared_ptr, hence it'll be deallocated automatically"

p_ctx = boost::static_pointer_cast<void>(context_);

context_->set_options(boost::asio::ssl::context::default_workarounds);

context_->use_certificate_chain_file(cert_chain_file);
context_->use_certificate_file(cert_file, boost::asio::ssl::context::pem);
context_->use_private_key_file(cert_file, boost::asio::ssl::context::pem);

context_->set_verify_mode(boost::asio::ssl::verify_peer);
context_->set_verify_callback(boost::bind(&verify_certificate_cb, _1, _2));

verify_certificate_cb回调函数

bool verify_certificate_cb(bool preverified, boost::asio::ssl::verify_context& ctx)
{
std::cout << "Function : " << __func__ << " ----------------- Line : " << __LINE__ << std::endl;
int8_t subject_name[256];
X509_STORE_CTX *cts = ctx.native_handle();
int32_t length = 0;
X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle());
std::cout << "CTX ERROR : " << cts->error << std::endl;

int32_t depth = X509_STORE_CTX_get_error_depth(cts);
std::cout << "CTX DEPTH : " << depth << std::endl;

switch (cts->error)
{
case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
Debug(PRIORITY_ERROR, "X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT");
break;
case X509_V_ERR_CERT_NOT_YET_VALID:
case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
Debug(PRIORITY_ERROR, "Certificate not yet valid!!");
break;
case X509_V_ERR_CERT_HAS_EXPIRED:
case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
Debug(PRIORITY_ERROR, "Certificate expired..");
break;
case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
Debug(PRIORITY_WARN, "Self signed certificate in chain!!!\n");
preverified = true;
break;
default:
break;
}
const int32_t name_length = 256;
X509_NAME_oneline(X509_get_subject_name(cert), reinterpret_cast<char*>(subject_name), name_length);
Debug(PRIORITY_INFO, "Verifying %s", subject_name);
Debug(PRIORITY_INFO, "Verification status : %d", preverified);

std::cout << "Function : " << __func__ << " ----------------- Line : " << __LINE__ << std::endl;
return preverified;
}

如果没有正确的证书文件,我该如何修改不允许连接的代码?提前致谢!

最佳答案

终于解决了。我的一位队友建议将标志 boost::asio::ssl::verify_fail_if_no_peer_certboost::asio::ssl::verify_peer 结合使用,并且它起作用了。

更新的代码行:

context_->set_verify_mode(boost::asio::ssl::verify_peer | boost::asio::ssl::verify_fail_if_no_peer_cert);

关于c++ - 如何使用 boost::asio SSL 验证客户端证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16890339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com