Asio 包含了一个类以及类模板用于基本的SSL支持。这个类使得加密通信成为可能。在已经存在的流上层做了一层加密,比如加密一个TCP套接字。在创建一个加密流之前,必须要构造一个SSL context 对象,这个对象用于设置SSL选项(认证模式,认证文件等),下面用一个客户端的初始化作为说明:

ssl::context ctx(ssl::context::sslv23);
ctx.set_verify_mode(ssl::verify_peer);
ctx.load_verify_file("ca.pem");

// 如果要使用一个TCP套接字,如下操作:
ssl::stream ssl_sock(my_io_service, ctx);

// 如果要使用一个指定的套接字操作。
// 例如创建一个对外的链接或者接收一个进入的链接。
// 必须首先使用ssl::stream 模板的lowest_layer()成员函数来获得一个底层套接字:

ip::tcp::socket::lowest_layer_type& sock = ssl_sock.lowest_layer();
sock.connect(my_endpoint);

// 在有些例子中,底层流对象可能需要一个比ssl流更长的生存周期,在这种情况下,模板参数应该是一个流的引用:

ip::tcp::socket sock(my_io_service);
ssl::stream ssl_sock(sock, ctx);

// 在通过加密链接收发数据之前,SSL的握手动作应该首先完成。通过使用ssl::stream 模板提供的 handshake() / async_handshake()成员函数。
// 一旦链接建立了,SSL流对象可以使用同步或异步的read/write进行流的读写操作,可以使用read(),async_read(),write(),async_write(),read_until(),async_read_until()等函数。

// 证书认证:
// Boost.Asio 提供了多种方法设置SSL证书认证的加密方式:

ssl::context::set_default_verify_paths()
ssl::context::set_verify_mode()
ssl::context::set_verify_callback()
ssl::context::load_verify_file()
ssl::stream::set_verify_mode()
ssl::stream::set_verify_callback()

// 按照RFC2818(HTTPS 证书认证) 规则,Boost.Asio提供了一个复用认证回调函数作为一个函数对象(ssl::rfc2818_verification),下面的例子演示了一个远程主机使用HTTPS按照这个规则的证书认证过程:

using boost::asio::ip::tcp;
namespace ssl = boost::asio::ssl;
typedef ssl::stream ssl_socket;

// Create a context that uses the default paths for
// finding CA certificates.
ssl::context ctx(ssl::context::sslv23);
ctx.set_default_verify_paths();

// Open a socket and connect it to the remote host.
boost::asio::io_service io_service;
ssl_socket sock(io_service, ctx);
tcp::resolver resolver(io_service);
tcp::resolver::query query("host.name", "https");
boost::asio::connect(sock.lowest_layer(), resolver.resolve(query));
sock.lowest_layer().set_option(tcp::no_delay(true));

// Perform SSL handshake and verify the remote host's
// certificate.
sock.set_verify_mode(ssl::verify_peer);
sock.set_verify_callback(ssl::rfc2818_verification("host.name"));
sock.handshake(ssl_socket::client);

// ... read and write as normal ...

// SSL和线程
// SSL流对象不会自己对自己进行锁定,因此,所有的异步SSL操作需要在一个线程中强制顺序执行,这也就意味着在单线程程序中不需要考虑同步操作的问题。

// 特别注意:
// 如果要使用Boost.Asio中的SSL的支持,OpenSSL也是必须要支持的。当一个程序需要使用底层OpenSSL提供的接口,而并不是要使用Boost.Asio封装后的SSL接口时,可以通过调用 ssl::context::native_handle() 或者 ssl::stream::native_handle()取得底层OpenSSL。

asio ssl 笔记相关推荐

  1. boost::asio ssl

    以 boost::asio::ssl::stream<boost::asio::ip::tcp::socket>  代替 boost::asio::ip::tcp::socket 客户端c ...

  2. boost::asio::ssl 漏洞扫描应对

    boost::asio::ssl 漏洞扫描应对 SSL 3.0 POODLE攻击信息泄露漏洞(CVE-2014-3566) 服务器支持 TLS Client-initiated 重协商攻击(CVE-2 ...

  3. Boost asio学习笔记之一—— 使用strand支持多线程调用service_io的方法

    asio是一个跨平台的网络库,可以作为boost的一部分,也可以使用独立的asio部分.这里记录学习的笔记,作为参考. 感觉asio的关键就是io_service对象.所有的异步同步都跟这个有关.多线 ...

  4. Boost asio学习笔记之二—— 网络编程

    boost库中的网络编程的例子比较复杂,不太好理解,所以,从网上找了一个简单点的例子.网址如下:http://blog.chinaunix.net/u3/93184/showart_1846119.h ...

  5. HTTPS|SSL笔记-SSL分手过程(Encrypted Alert)

    目前在做一个多线程Restful风格的Web服务器. 以前只分析了握手过程,今天来看下分手过程. 服务端端口:18888 客户端端口:53532 框起来的那个是SSL分手的2个包,后面4个是TCP分手 ...

  6. HTTPS|SSL笔记-SSL双向认证失败(服务端证书信任库不含客户端证书)握手过程(含wireshark分析)

    这里我把服务端信任库添加了其他证书,不含客户端的证书,这时SSL认证失败报错如下.下面来分析下: 1. 首先是TCP三次握手,对应的包如下: 2. 握手成功后,客户端发送自己支持的加密套,和随机数给服 ...

  7. HTTPS|SSL笔记-SSL双向认证成功握手过程(含wireshark分析)

    这里只研究连接过程. 整体的流程是这样的 前三个那个SYN.SYN ACK.ACK是TCP三次握手,就不说了. 1. 握手成功后,客户端发送自己支持的加密套,和随机数给服务端,也就是Client He ...

  8. boost.asio mysql_boost asio学习笔记

    1: 发现一个很诡异的问题: #include #include #include #include using namespace std; void print(const boost::syst ...

  9. HTTPS|SSL笔记-SSL双向认证失败(客户端证书信任库不含服务端证书)握手过程(含wireshark分析)

    这里我把客户端证书信任库里面清空,及没放服务端证书,Java报错不一样,但抓包是一样的,在此记录下过程. 1. 前3个包是TCP三次握手,在此不解析,对应的包如下: 2. 握手成功后,客户端发送自己支 ...

  10. 基于boost asio实现的支持ssl的通用socket框架

    情景分析    现已存在一个可用稳定的异步客户端类http_client_base,该类基于boost asio实现了连接服务器,发送请求,获取响应和解析http数据等操作,该类的大致实现框架如下   ...

最新文章

  1. matlab GUI figure置右上角
  2. nginx https http2
  3. iphone6php怎么打开,苹果手机中的heic格式文件怎么打开
  4. android java service_[Java教程]Android四大组件之Service浅见
  5. Vmware报错 This product may not be installed on a computer that has Microsoft HyperV installed. 解决
  6. 百分点感知智能实验室:语音识别技术发展阶段探究
  7. 我的工程学导论学习心得1
  8. 网桥算法的源代码c语言版,透明网桥算法(C语言)
  9. 抖音小程序支付宝异步回调中验签php代码
  10. 盒子模型--标准盒模型和怪异盒模型
  11. 微信小程序学习和实践总结
  12. 算法之回溯算法-24点问题
  13. linux系统有什么用
  14. Python实现RSA数字签名一
  15. 局域网远程连接另一台电脑
  16. QPBOC之GPO(一):CVM处理
  17. 作业调度、进程调度、实时调度的几种典型算法
  18. 快速掌握linux常用命令
  19. 分清“语言/规范”以及“平台/实现”,以及跨平台.NET开发“.NET研究”
  20. Linux性能优化-CPU性能优化思路

热门文章

  1. MaxNewSize is equal to or greater than the entire heap . A new max generation size of will be used.
  2. Linux iptables MASQUERADE的作用
  3. 面试官问你为什么离开上一家公司该怎么回答?
  4. IEEE 802.11标准协议下载
  5. NLP(五十二)抽取式词义消歧(WSD)
  6. 17. Zigbee应用程序框架开发指南 - 使用Ember AppBuilder设计应用程序
  7. uniapp 微信小程序 分片 断点续传 大文件上传
  8. 阿里巴巴国际站组合标题的小技巧
  9. linux嵌入式主要学什么软件,嵌入式软件工程师需要学什么?嵌入式Linux开发的工作内容...
  10. Cypress使用教程