什么是 boost::asio::ssl::context::load_verify_file 以及如何使用它?

2024-05-26

有一个谨慎的小量 boost::asio::ssl http://en.wikipedia.org/wiki/Transport_Layer_Security小型 C++ 在线教育代码库。甚至更少boost::asio::ssl::context::load_verify_file http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/reference/ssl__context/load_verify_file.html所以我找到了一个来自here https://stackoverflow.com/questions/7046370/https-request-with-boost-asio-and-openssl代码修改最少 - 使用 boost 1.47.0 编译并运行:

#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>
#include <boost/bind.hpp>
#include <iostream>
#include <istream>
#include <ostream>
#include <string>


class client
{
public:
    client(boost::asio::io_service& io_service, boost::asio::ssl::context& context, boost::asio::ip::tcp::resolver::iterator endpoint_iterator)
        : socket_(io_service, context)
    {
        socket_.set_verify_mode(boost::asio::ssl::context::verify_none);
        socket_.set_verify_callback(boost::bind(&client::verify_certificate, this, _1, _2));

        boost::asio::async_connect(socket_.lowest_layer(), endpoint_iterator, boost::bind(&client::handle_connect, this, boost::asio::placeholders::error));
    }

    bool verify_certificate(bool preverified, boost::asio::ssl::verify_context& ctx)
    {
        char subject_name[256];
        X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle());
        X509_NAME_oneline(X509_get_subject_name(cert), subject_name, 256);
        std::cout << "Verifying:\n" << subject_name << std::endl;

        return preverified;
    }

    void handle_connect(const boost::system::error_code& error)
    {
        if(!error){
            std::cout << "Connection OK!" << std::endl;
            socket_.async_handshake(boost::asio::ssl::stream_base::client, boost::bind(&client::handle_handshake, this, boost::asio::placeholders::error));
        }else{
            std::cout << "Connect failed: " << error.message() << std::endl;
        }
    }

    void handle_handshake(const boost::system::error_code& error)
    {
        if(!error){
            std::cout << "Sending request: " << std::endl;

            std::stringstream request_;

            request_ << "GET /api/0/data/ticker.php HTTP/1.1\r\n";
            request_ << "Host: mtgox.com\r\n";
            request_ << "Accept-Encoding: *\r\n";
            request_ << "\r\n";

            std::cout << request_.str() << std::endl;

            boost::asio::async_write(socket_, boost::asio::buffer(request_.str()), boost::bind(&client::handle_write, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
        }else{
            std::cout << "Handshake failed: " << error.message() << std::endl;
        }
    }

    void handle_write(const boost::system::error_code& error, size_t bytes_transferred)
    {
        if (!error){
            std::cout << "Sending request OK!" << std::endl;
            boost::asio::async_read(socket_, boost::asio::buffer(reply_, bytes_transferred), boost::bind(&client::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
        }else{
            std::cout << "Write failed: " << error.message() << std::endl;
        }
    }

    void handle_read(const boost::system::error_code& error, size_t bytes_transferred)
    {
        if (!error){
            std::cout << "Reply: ";
            std::cout.write(reply_, bytes_transferred);
            std::cout << "\n";
        }else{
            std::cout << "Read failed: " << error.message() << std::endl;
        }
    }

private:
    boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket_;
    char reply_[0x1 << 16];
};

int main(int argc, char* argv[])
{
    try{
        boost::asio::io_service io_service;

        boost::asio::ip::tcp::resolver resolver(io_service);
        boost::asio::ip::tcp::resolver::query query("mtgox.com", "443");
        boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);

        boost::asio::ssl::context context(boost::asio::ssl::context::sslv23);
        //context.load_verify_file("key.pem"); // uncomment this line

        client c(io_service, context, iterator);

        io_service.run();
    }catch (std::exception& e){
        std::cerr << "Exception: " << e.what() << "\n";
    }

    std::cin.get();
    return 0;
}

这是一行非常奇怪的行:context.load_verify_file("key.pem");所以我对此有一些疑问:

  1. 作为 http 客户端,这对我意味着什么?
  2. 是否发送到服务器?
  3. 如何创建这样的文件?
  4. 到底是为了什么?
  5. 代码无需它即可编译和运行。可以吗?如果没有这个,我们与服务器的连接是否安全key.pem?
  6. 我想使用谷歌或其他大型 ssl 主机。我该怎么办?

简单来说 :

.pem 文件可以包含证书(公钥)、私钥或两者的组合。 PEM是一种数据编码方式,X509认证通常与PEM一起使用。例如,服务器读取 .pem 文件并将证书发送给客户端,以便客户端可以在连接之前验证它。

具有自签名证书的服务器会在当今的浏览器上弹出警告,表示它不受信任(除非由自签名证书签名)CA http://en.wikipedia.org/wiki/Certificate_authority,并且浏览器有一个签名 CA 的数据库,它们使用该数据库来验证证书是否“有效”),您可以检查证书详细信息并决定是否信任该站点。一个很好的例子是IETF.org https://ietf.org链接,因为他们的证书不久前过期了:)

  1. 作为客户,这可能意味着某些东西,但除非您需要,否则不需要。也就是说,如果服务器发送证书,您的客户端may想要在继续​​之前验证它,在这种情况下,您将需要来自签署服务器证书的 CA 的信息,该信息可以从包含 CA 信息的 .pem 文件加载。如果您的客户不关心验证,那么它就不需要它。

    基本上是load_verify_file()函数加载CA信息以对服务器发送的证书进行验证。

    您可以创建自己的 CA 文件并签署自己的服务器证书,然后将您自己的 CA 文件与客户端一起使用,以验证您是否正在连接到自己的服务器。

  2. 读 1. 不,客户端不发送它。

  3. 如果您想了解更多信息,这里有一个guide http://devsec.org/info/ssl-cert.html直接来自duckduckgo。

  4. 阅读 3 和本文的开头。

  5. 如果客户端接受服务器证书并且没有因为无法验证而拒绝它,那么就可以了。易于检查,仅启用与服务器之间的 ssl 连接,并查看客户端是否会连接并执行其应该执行的工作,或者只是嗅探流量并进行查找。

  6. 不确定你的意思是什么。购买 ssl 主机?如果是这样,问题仍然在于您的客户端是否想要接受连接。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是 boost::asio::ssl::context::load_verify_file 以及如何使用它? 的相关文章

  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 重载<<的返回值

    include
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • HTML5 最佳实践;节/标题/旁白/文章元素[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 网络上 以及 stackoverflow 上 有足够的有关 HTML5 的信息 但现在我对 最佳实践 感到好奇 像节 标题 文章这样的标签是新的
  • 深入研究 JS 中的原型 [重复]

    这个问题在这里已经有答案了 我一直在尝试理解 JS 中原型的概念 但由于某种原因我发现它真的令人困惑 为什么以及何时使用原型 这有什么区别 从这个MDN 示例 https developer mozilla org en US docs J
  • Laravel 无法连接 Oracle

    我在用着耶吉拉 laravel oci8 https github com yajra laravel oci8用于 Oracle 与 Laravel 的连接 但我无法从客户端 PC 连接到 Oracle 服务器 showing this
  • ggplot2 中列组合的分面图

    我正在做相关性的组合 并且想在 ggplot2 中绘制每个组合 然而 我希望每个组合都在一个单独的面板上 而不是一个面板上的所有点 making up columns in my real data I m doing correlatio
  • 提供常量

    Provide 在 RC4 中已被弃用 以前 我可以这样做 provide API URL useValue address 我正在尝试这样的事情 provide API URL useValue address 但这不起作用 我找到了几个
  • 如何持久保存另一个应用程序提供的PendingIntent

    假设我想实现一个向其他应用程序公开服务的应用程序 例如 Google Play 服务 潜在的应用程序将注册与我的服务相关的特殊事件 并会在正确的时间收到通知 我正在考虑像 Google 对 Google Play 服务所做的那样来实现这一点
  • 如何显示证书的主题备用名称?

    我发现的最接近的答案是使用 grep gt openssl x509 text noout in cert pem grep DNS 有更好的方法吗 我只喜欢命令行 Thanks 较新版本的 openssl 有一个 ext 选项 允许您仅打
  • 从“Google 我的商家”获取 PHP 格式的营业时间

    我需要一些 PHP 代码来从我的 google 我的商家列表中提取我的营业时间 这在我的本地计算机上有效 但当我实时推送网站时不起作用 此代码停止我的 css 渲染并且不加载任何其他内容
  • php - 当存在 CDATA 时,将 xml 转换为 json 不起作用

    如果我使用以下php代码来转换xml to json I get Company fcsf Details n fgrtgrthtyfgvb n 但是 如果我使用CDATA in the Details元素如下
  • window.top.document.body.scrollTop 在 Chrome 或 FireFox 中不起作用

    我有下面的代码将打开一个模式窗口 这适用于 IE 8 但不适用于 Chrome 或 FF 我是跨浏览器功能领域的新手 function ShowModal WindowID FramesetID window onscroll functi
  • 如何使用带有“transfer-encoding: chunked”的 winhttp api

    我正在尝试将一些数据发送到需要 传输编码 分块 标头的网络服务 它可以很好地处理普通的 POST 请求 但一旦我添加标题 我总是会得到 由于以下情况 内容无法交付 收到客户端的无效请求 这是发送请求的部分 std vector
  • 不同保护条件下的状态转换

    在状态模式中这是如何建模的 当当前状态为 A 时 在触发器 X 和条件 C1 上状态 A 到状态 B 当当前状态为 A 时 在触发器 X 和条件 C2 上状态 A 到状态 C 这通常是如何实现的 我有很多可能需要实施的守卫条件 这是相当标准
  • Android Google Cloud Messaging (GCM) 和不匹配的发件人 ID

    我正在尝试在我的 Android 应用程序中使用 GCM 服务 为此 我使用了 android 文档http developer android com guide google gcm gcm html http developer an
  • 如何从前端使用 AWS CloudWatch Logs 提交简单日志?

    经过大约 1 小时的搜索 我没有找到任何有关 如何向 AWS CloudWatch Logs 提交简单日志 的信息从前端侧 几乎所有示例都是针对 Node js 的 但我需要从前端提交错误 而不是从后端提交错误 我什至没有找到应该用于前端的
  • 具有自定义集合属性的 JPA 投影

    我们正在使用 Spring Data 并尝试使用子查询创建自定义查询 结果投影有一个数组和其他属性 我们的问题在于子查询数组 public interface ProfesionalRepository extends JpaReposit
  • 安排复杂功能更新

    我在 Apple Watch 上有一个自定义复杂功能 我试图每小时更新一次 它应该每小时 ping 一个 API 端点 如果数据自上次检查以来发生了变化 则应更新复杂性 这是我目前所拥有的 似乎只有一次的效果 当它起作用时 它确实会 pin
  • Mojolicious:我应该使用一个还是多个 websocket?

    我正在自学 Mojolicious 和 websockets 到目前为止 我已经有了一个网页 它显示数据库中的行 并具有用于添加 删除和更新行以及选择用于排序的列的按钮 目前 它在每个按钮的 javascript onclick 处理程序中
  • 运行SpringBootTest时访问H2控制台

    如果我正在运行测试 SpringBootTest有什么办法可以访问H2控制台吗 我有一个访问 H2 数据库 成功 的测试 但如果我想自己检查数据库 我该怎么做 我首先运行测试webEnvironment DEFINED PORT and h
  • 声明与定义

    在 C 中 声明与定义有何不同 即 类声明与类定义 变量声明与定义 方法参数声明与定义 在 C 中 这是相当明显的 但在 C 中 从 ECMA 标准和 MSDN 可以看出 一切都是声明 并且在使用定义一词的地方 它与声明具有相同的含义 在使
  • 什么是 boost::asio::ssl::context::load_verify_file 以及如何使用它?

    有一个谨慎的小量 boost asio ssl http en wikipedia org wiki Transport Layer Security小型 C 在线教育代码库 甚至更少boost asio ssl context load