【问题标题】:Handshake failed: certificate verify failed (Boost ASIO)握手失败:证书验证失败(Boost ASIO)
【发布时间】:2015-07-07 13:58:28
【问题描述】:

您好,我正在尝试连接到服务器:

    argv[1] = "demo.demo.com"; // or httpbin.com
    argv[2] = "39473"; // or 80

使用类似的代码:

http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/example/ssl/client.cpp

我遇到的问题是这样的:

Handshake failed: certificate verify failed

我试过这个:

boost::asio::ssl::context ctx(boost::asio::ssl::context::sslv23);
ctx.set_verify_mode(boost::asio::ssl::verify_none);
//ctx.set_default_verify_paths();

有没有办法直接连接而不验证证书。

【问题讨论】:

  • 我也试过 argv[1] = "httpbin.org"; argv[2] = "80";但仍然遇到同样的错误

标签: c++ ssl boost boost-asio


【解决方案1】:

您可以添加一个返回 true 的验证回调:

socket_.set_verify_callback(
    boost::bind(&client::verify_certificate, this, _1, _2));

在哪里

  bool verify_certificate(bool preverified,
      boost::asio::ssl::verify_context& ctx)
  {
      return true;
  }

【讨论】:

  • 请不要在没有指出影响的情况下禁用证书验证。验证不是需要禁用的麻烦,而是 TLS 安全性的重要组成部分。
  • 你知道的。问题就是这样。我同意你的看法。这甚至不是一件麻烦事。这只是要做的事情(如输入验证)。没什么大不了的。我不推荐任何东西
  • 是的,您只是提供了示例代码,甚至没有明确告知此代码禁用了验证。我看到的问题是有人可能会在不了解代码及其含义的情况下使用此代码来“修复”问题。已经有足够多的应用程序可以做到这一点。
  • @SteffenUllrich 我想你还没有理解这个问题及其含义。
  • @sehe 谢谢让我试试这个,因为我需要禁用才能继续使用我们的应用程序进行开发,并且会在整个逻辑启动并运行时修复此验证。所以我认为这是一个有效的问题和答案
【解决方案2】:

因此错误表明返回的证书与加载的证书不匹配。在示例代码中,加载的证书出现在此处:

ctx.load_verify_file("ca.pem");

作为测试,您可以尝试以下方法。在 CMD shell 中发出这个命令(我假设你已经安装了 openssl):

openssl s_client -connect demo.demo.com:39473 -showcerts

检查返回的输出,并将其与您的 ca.pem 文件进行比较。我敢打赌它们是不同的。您甚至可以尝试将 ca.pem 文件的内容替换为从 opensll 返回的文本,希望这样可行。

您的里程可能会有所不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-26
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 2012-03-02
    • 2012-03-15
    • 2019-07-21
    相关资源
    最近更新 更多