非阻塞/异步(epoll) openssl

原创 2015年07月09日 17:00:25

前段时间在自己的异步网络框架handy中添加openssl的支持,当时在网络上搜索了半天也没有找到很好的例子,后来自己慢慢的摸索,耗费不少时间,终于搞定。因此把相关的资料整理一下,并给出简单的例子,让后学者可以少费些力气。

同步的openssl调用网上已经有许多的例子,这里就不再详细介绍,大家也可以直接读源代码:

同步客户端:https://github.com/yedf/openssl-example/blob/master/sync-ssl-cli.cc
该例子连接www.openssl.com:443,发送一个Http请求,并打印结果中的前256个字符

同步服务器端:https://github.com/yedf/openssl-example/blob/master/sync-ssl-svr.cc
该例子监听本地的443端口,并返回一个简单http响应

下面详细介绍非阻塞调用

1. 初始化SSL库
SSL_load_error_strings ();
SSL_library_init ();
sslContext = SSL_CTX_new (SSLv23_method ());

//server端需要初始化证书与私钥
string cert = "server.pem", key = "server.pem";
r = SSL_CTX_use_certificate_file(g_sslCtx, cert.c_str(), SSL_FILETYPE_PEM);
r = SSL_CTX_use_PrivateKey_file(g_sslCtx, key.c_str(), SSL_FILETYPE_PEM);
r = SSL_CTX_check_private_key(g_sslCtx);


2. 非阻塞方式建立tcp连接(网上有很多epoll相关例子)

3. 使用已建立连接的socket初始化ssl
ch->ssl_ = SSL_new (g_sslCtx);
int r = SSL_set_fd(ch->ssl_, ch->fd_);
服务器端 SSL_set_accept_state(ch->ssl_);
客户端 SSL_set_connect_state(ch->ssl_);

4. epoll_wait后,如果SSL相关的socket有读写事件需要处理则进行SSL握手,直到握手完成
int r = SSL_do_handshake(ch->ssl_);
if (r == 1) { // 若返回值为1,则SSL握手已完成
  ch->sslConnected_ = true;
  return;
}
int err = SSL_get_error(ch->ssl_, r);
if (err == SSL_ERROR_WANT_WRITE) { //SSL需要在非阻塞socket可写时写入数据
  ch->events_ |= EPOLLOUT; 
  ch->events_ &= ~EPOLLIN;
} else if (err == SSL_ERROR_WANT_READ) { //SSL需要在非阻塞socket可读时读入数据
  ch->events_ |= EPOLLIN; //等待socket可读
  ch->events_ &= ~EPOLLOUT; //暂时不关注socket可写状态
} else { //错误
  ERR_print_errors(errBio);
}

5. 握手完成后,进行SSL数据的读写
SSL_write(con->sslHandle, text, len);
SSL_read(con->sslHandle, buf, sizeof buf);

详细可运行的例子参看
https://github.com/yedf/openssl-example/blob/master/async-ssl-svr.cc
https://github.com/yedf/openssl-example/blob/master/async-ssl-cli.cc

handy已经对openssl进行了封装,并且给出了例子,详见
https://github.com/yedf/handy-ssl

HTTPS是大势所趋?看腾讯专家通过Epoll+OpenSSL在高并发压测机器人中支持https

WeTest 导读用epoll编写一个高并发网络程序是很常见的任务,但在epoll中加入ssl层的支持则是一个不常见的场景。腾讯WeTest服务器压力测产品,在用户反馈中收到了不少支持https协议的...
  • wetest_tencent
  • wetest_tencent
  • 2016年12月01日 19:32
  • 1185

openssl下https实现流程

WeTest 导读 用epoll编写一个高并发网络程序是很常见的任务,但在epoll中加入ssl层的支持则是一个不常见的场景。腾讯WeTest服务器压力测产品,在用户反馈中收到了不少支持https协议...
  • u012654882
  • u012654882
  • 2016年12月09日 09:57
  • 3588

openssl 使用非阻塞 bio

在 openssl 中使用非阻塞的bio方法纪要。通过与 epoll 的配合,完成高效的加密连接处理...
  • vinson0526
  • vinson0526
  • 2016年03月08日 18:53
  • 2752

深入了解epoll (转)

深入了解epoll (转) 一、 介绍 Epoll 是一种高效的管理socket的模型,相对于select和poll来说具有更高的效率和易用性。传统的select以及poll的效率会因...
  • bravegogo
  • bravegogo
  • 2015年11月07日 16:36
  • 601

openssl处理非阻塞socket

上篇博文是使用libevent加入ssl功能:  http://blog.csdn.net/fly2010love/article/details/46459485  文中说道,在处理非阻塞soc...
  • bestone0213
  • bestone0213
  • 2015年07月24日 11:36
  • 1354

openssl处理非阻塞socket

openssl处理非阻塞socket
  • fly2010love
  • fly2010love
  • 2015年06月12日 12:00
  • 3305

彻底学会使用epoll(四)——ET的写操作实例分析

首先,看程序四的例子。 l 程序四 点击(此处)折叠或打开 #include unistd.h> #include iostream> #...
  • weiyuefei
  • weiyuefei
  • 2016年08月18日 17:12
  • 2133

慢慢聊异步IO之Linux Epoll

一、What:异步IO Epoll是什么?  1. 一句话总结 允许进程发起很多I/O操作,而不用阻塞或等待任何操作完成。Epoll是Linux下的网络异步IO库函数。   2. 详细说说 ...
  • zhxue123
  • zhxue123
  • 2014年03月27日 14:16
  • 5066

非阻塞/异步(epoll) openssl

前段时间在自己的异步网络框架handy中添加openssl的支持,当时在网络上搜索了半天也没有找到很好的例子,后来自己慢慢的摸索,耗费不少时间,终于搞定。因此把相关的资料整理一下,并给出简单的例子,让...
  • i7thTool
  • i7thTool
  • 2016年03月02日 14:21
  • 696

openssl 学习之SSL/TLS

之前在微博上看到一个分享,关于HTTPS的,原文链接The First Few Milliseconds of an HTTPS Connection,加上最近也在学习openssl 的相关知识。所...
  • kkxgx
  • kkxgx
  • 2013年10月19日 13:09
  • 15845
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:非阻塞/异步(epoll) openssl
举报原因:
原因补充:

(最多只允许输入30个字)