asio ssl 笔记
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 笔记相关推荐
- boost::asio ssl
以 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> 代替 boost::asio::ip::tcp::socket 客户端c ...
- boost::asio::ssl 漏洞扫描应对
boost::asio::ssl 漏洞扫描应对 SSL 3.0 POODLE攻击信息泄露漏洞(CVE-2014-3566) 服务器支持 TLS Client-initiated 重协商攻击(CVE-2 ...
- Boost asio学习笔记之一—— 使用strand支持多线程调用service_io的方法
asio是一个跨平台的网络库,可以作为boost的一部分,也可以使用独立的asio部分.这里记录学习的笔记,作为参考. 感觉asio的关键就是io_service对象.所有的异步同步都跟这个有关.多线 ...
- Boost asio学习笔记之二—— 网络编程
boost库中的网络编程的例子比较复杂,不太好理解,所以,从网上找了一个简单点的例子.网址如下:http://blog.chinaunix.net/u3/93184/showart_1846119.h ...
- HTTPS|SSL笔记-SSL分手过程(Encrypted Alert)
目前在做一个多线程Restful风格的Web服务器. 以前只分析了握手过程,今天来看下分手过程. 服务端端口:18888 客户端端口:53532 框起来的那个是SSL分手的2个包,后面4个是TCP分手 ...
- HTTPS|SSL笔记-SSL双向认证失败(服务端证书信任库不含客户端证书)握手过程(含wireshark分析)
这里我把服务端信任库添加了其他证书,不含客户端的证书,这时SSL认证失败报错如下.下面来分析下: 1. 首先是TCP三次握手,对应的包如下: 2. 握手成功后,客户端发送自己支持的加密套,和随机数给服 ...
- HTTPS|SSL笔记-SSL双向认证成功握手过程(含wireshark分析)
这里只研究连接过程. 整体的流程是这样的 前三个那个SYN.SYN ACK.ACK是TCP三次握手,就不说了. 1. 握手成功后,客户端发送自己支持的加密套,和随机数给服务端,也就是Client He ...
- boost.asio mysql_boost asio学习笔记
1: 发现一个很诡异的问题: #include #include #include #include using namespace std; void print(const boost::syst ...
- HTTPS|SSL笔记-SSL双向认证失败(客户端证书信任库不含服务端证书)握手过程(含wireshark分析)
这里我把客户端证书信任库里面清空,及没放服务端证书,Java报错不一样,但抓包是一样的,在此记录下过程. 1. 前3个包是TCP三次握手,在此不解析,对应的包如下: 2. 握手成功后,客户端发送自己支 ...
- 基于boost asio实现的支持ssl的通用socket框架
情景分析 现已存在一个可用稳定的异步客户端类http_client_base,该类基于boost asio实现了连接服务器,发送请求,获取响应和解析http数据等操作,该类的大致实现框架如下 ...
最新文章
- matlab GUI figure置右上角
- nginx https http2
- iphone6php怎么打开,苹果手机中的heic格式文件怎么打开
- android java service_[Java教程]Android四大组件之Service浅见
- Vmware报错 This product may not be installed on a computer that has Microsoft HyperV installed. 解决
- 百分点感知智能实验室:语音识别技术发展阶段探究
- 我的工程学导论学习心得1
- 网桥算法的源代码c语言版,透明网桥算法(C语言)
- 抖音小程序支付宝异步回调中验签php代码
- 盒子模型--标准盒模型和怪异盒模型
- 微信小程序学习和实践总结
- 算法之回溯算法-24点问题
- linux系统有什么用
- Python实现RSA数字签名一
- 局域网远程连接另一台电脑
- QPBOC之GPO(一):CVM处理
- 作业调度、进程调度、实时调度的几种典型算法
- 快速掌握linux常用命令
- 分清“语言/规范”以及“平台/实现”,以及跨平台.NET开发“.NET研究”
- Linux性能优化-CPU性能优化思路
热门文章
- MaxNewSize is equal to or greater than the entire heap . A new max generation size of will be used.
- Linux iptables MASQUERADE的作用
- 面试官问你为什么离开上一家公司该怎么回答?
- IEEE 802.11标准协议下载
- NLP(五十二)抽取式词义消歧(WSD)
- 17.	Zigbee应用程序框架开发指南 - 使用Ember AppBuilder设计应用程序
- uniapp 微信小程序 分片 断点续传 大文件上传
- 阿里巴巴国际站组合标题的小技巧
- linux嵌入式主要学什么软件,嵌入式软件工程师需要学什么?嵌入式Linux开发的工作内容...
- Cypress使用教程