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。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值