转自:

OpenSSL一直以来各种被诟病,具体挑了哪些刺,本文就不深究。作为OpenSSL有很多替代,我了解到的有cyaSSL(WolfSSL)和PolorSSL。其中PolarSSL已经被ARM收购了,改名为mbedTLS。本文列举了作为一个SSL client端,应该如何使用mbedTLS。本文可以搭配我上一篇文章OpenSSL一起看;单独看也没问题

本文地址:https://segmentfault.com/a/1190000005998141

Reference

mbed TLS tutorial - Knowledge Base
ARMmbed / mbedtls / programs / ssl / ssl_client1.c

mbedTLS 基本使用

与传统 socket 的对比

传统的socket-based的程序,依照顺序,作为client要做以下的函数调用:

gethostbyname()
socket()
connect()
write()
read()

改成SSL之后,mbedTLS对应上述函数,分别对应为:

gethostbyname()   \
socket()          -+--> mbedtls_net_connect() + mbedtls_ssl_handshake()
connect()         /
write()           ----> mbedtls_ssl_write()
read()            ----> mbedtls_ssl_read()

当然,实际情况下,会使用更多的其他函数。具体(最简单的)流程见下文

数据结构

mbedtls_net_context:目前只有文件描述符,可以用于适配异步I/O库
mbedtls_ssl_context:保存SSL基本数据
mbedtls_ssl_config
mbedtls_ctr_drbg_context
mbedtls_entropy_context:保存熵配置
mbedtls_x509_crt:保存认证信息

Init 阶段

下面是init阶段需要调用的各函数。函数的参数,在调用的时候按照上面的函数类型一个一个传入就行了

mbedtls_net_init()
mbedtld_ssl_init()
mbedtld_ssl_config_init()
mbedtls_ctr_drbg_init()
mbedtld_x509_crt_init()
mbedtls_entropy_init()
mebdtls_ctr_drbg_seed()

其中mebdtls_ctr_drbg_seed()可以指定熵函数。如果回调使用默认的mbedtls_entropy_func的话,可以传入一个初始的熵seed,也可以NULL

Connect 阶段

mbedtls_net_connect():参数是server和端口,均为字符串。server可以使域名或者IP字符串。最后一个参数使用MBEDTLS_NET_PROTO_TCP即可。端口号不仅仅可以传入数字字符串,也可以类似于get_addrinfo函数的protocol参数那样,传入类似于“HTTPS”这样的可读化字符串。

mbedtls_ssl_config_defaults()

适配异步I/O库

经实验,mbedTLS是可以顺利适配libev的,Good!(libuv没有实际试过,不过应该也是OK的)
什么?问我怎么不适配libevent? 要用libevent的话就用封装了OpenSSLbufferevent去啦

姊妹篇

OpenSSL 简单思路和函数笔记

作为 client 适配 libev 调用过程

以下是伪代码,有点多,从最简单的main()入手就好:

一些自定义的数据结构

typedef struct _MBEDTLS_SESSION {mbedtls_net_context      mbedNetCtx;mbedtls_ssl_context      mbedSslCtx;mbedtls_ssl_config       mbedSslConf;mbedtls_ctr_drbg_context mbedDrbgCtx;mbedtls_entropy_context  mbedEtpyCtx;mbedtls_x509_crt         mbedX509Crt;
} MbedTLSSession_st;typedef struct SSL_SESSION {struct ev_io         *libevWatcher;MbedTLSSession_st    mbedIntf;
} SSLSession_st;

MbedTLS初始化

MbedTlsClientInit(MbedTLSSession_st *session, void *entropy, size_t entropyLen)
{mbedtls_net_init(&(session->mbedNetCtx));mbedtls_ssl_init(&(session->mbedSslCtx));mbedtls_ssl_config_init(&(session->mbedSslConf));mbedtls_ctr_drbg_init(&(session->mbedDrbgCtx));mbedtls_x509_crt_init(&(session->mbedX509Crt));mbedtls_entropy_init(&(session->mbedEtpyCtx));mbedtls_ctr_drbg_seed(&(session->mbedDrbgCtx), mbedtls_entropy_func, &(session->mbedEtpyCtx), (unsigned char *)entropy, entropyLen);
}

MbedTLS的 connect 动作

AMCMbedTlsClientConnect(MbedTLSSession_st *session, const char *serverHost, int serverPort)
{int callStat;char portStrBuff[16];snprintf(portStrBuff, sizeof(portStrBuff), "%d", serverPort);callStat = mbedtls_net_connect(&(session->mbedNetCtx), serverHost, portStrBuff, MBEDTLS_NET_PROTO_TCP);_RETURN_IF_ERROR(callStat);callStat = mbedtls_ssl_config_defaults(&(session->mbedSslConf), MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT);_RETURN_IF_ERROR(callStat);mbedtls_ssl_conf_authmode(&(session->mbedSslConf), MBEDTLS_SSL_VERIFY_OPTIONAL);mbedtls_ssl_conf_ca_chain(&(session->mbedSslConf), &(session->mbedX509Crt), NULL);mbedtls_ssl_conf_rng(&(session->mbedSslConf), mbedtls_ctr_drbg_random, &(session->mbedDrbgCtx));//edtls_ssl_conf_dbg(&(session->mbedSslConf), NULL, NULL);mbedtls_ssl_set_bio(&(session->mbedSslCtx), &(session->mbedNetCtx), mbedtls_net_send, mbedtls_net_recv, mbedtls_net_recv_timeout);callStat = mbedtls_ssl_setup(&(session->mbedSslCtx), &(session->mbedSslConf));_RETURN_IF_ERROR(callStat);while((callStat = mbedtls_ssl_handshake(&(session->mbedSslCtx))) != 0){if ((callStat != MBEDTLS_ERR_SSL_WANT_READ)&& (callStat != MBEDTLS_ERR_SSL_WANT_WRITE)){return callStat;}}return 0;
}

主函数:

static SSLSession_st *g_session = NULL;main()
{SSLSession_st session;char *pers = "hello world";MbedTlsClientInit(&(session.mbedIntf), pers, strlen(pers));mbedtls_ssl_write(...);        // 发送请求。我用的是https://www.bing.com,所以发送的是HTTP请求/* 下面开始配置 libev */session.libevWatcher = malloc(sizeof(session.libevWatcher));set_nonblock(session.mbedNetCtx.fd)ev_io_init(&(session.libevWatcher), _libev_callback, fd, EV_READ);        // 在callback 调用 mbedtls_ssl_read()ev_io_start(loop, &(session.libevWatcher));ev_loop(loop, 0);
}
  • 2016年07月18日发布
  • 更多

mbedTLS(PolarSSL)简单思路和函数笔记(Client端)相关推荐

  1. Redis:安装、配置、操作和简单代码实例(C语言Client端)[转]

    我转的地址: http://blog.csdn.net/hj19870806/article/details/8724907 听说游戏的用的比较多,所以了解下. --以下为转载内容 Redis是一个开 ...

  2. oracle concat函数用法_大白的函数笔记:文本合并就是这么简单,不会的快来学...

    我们在工作中,经常会遇到需要把几个单元格的内容连接起来的情况,针对这种情况Excel为我们提供了几种方法:CONCATENATE函数.CONCAT函数"&"连接符和PHON ...

  3. Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记

    Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记 根据 JSR 335, Java 终于在 Java 8 中引入了 Lambda 表达式.也称之为闭包或者匿名函数. ...

  4. 奥数 python_奥数赛事china夺得冠军!简单思路用Python解经典数学题

    2019年第60届国际数学奥林匹克竞赛(IMO)结果出炉,奥数大赛中国夺冠 ,中美两国同时以227的总分并列团体冠军.中国队王者归来!6名队员全部摘金,总成绩荣获世界第一! 不要错过 免费学习Pyth ...

  5. mysql入门很简单系列视频-学习笔记

    mysql入门很简单系列视频-学习笔记 视频链接:mysql入门很简单系列视频 https://www.bilibili.com/video/av14920200/ 以前主要就了解DDL.DML.DC ...

  6. php随机缩略图,实现随机缩略图的简单思路和phpcms随机缩略图两种方法

    一种实现随机缩略图的简单思路:设置一个随机缩略图图片池(比如thumb文件夹),里面放若干张从"1.jpg"开始顺序命名的预置图片,判断无缩略图时,使用php的mt_rand(1, ...

  7. PHP代码审计之简单思路方法

    今天继续给大家介绍渗透测试相关知识,本文主要内容是PHP代码审计之简单思路方法. 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调:严禁 ...

  8. QT5实现简单的TCP通信Client端

    QT5实现简单的TCP通信Client端 基本步骤 完整代码 运行结果 最近学习了QT的TCP通信,与大家分享下刚开始写TCP通信的一些经验.下面简单写了个TCP客户端的小例程. 基本步骤 新建一个工 ...

  9. 教你如何运用python实现简单文件读写函数

    这篇文章主要为大家详细介绍了python实现简单文件读写函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 python作为脚本性语言,加上它的简便易用性.会经常当作脚 ...

最新文章

  1. 黑客解锁微信一键洗白、删好友、批量实名认证功能!38 名“海贼王”被判刑...
  2. Spark笔记:RDD基本操作(上)
  3. 【目标分类_长尾分布问题】BBN:Bilateral-Branch Network _ CVPR2020
  4. netflix的准实验面临的主要挑战
  5. 开发者如何快速精简容器云镜像?| 技术头条
  6. 【CCCC】L2-023 图着色问题 (25分),,图的染色判定,遍历
  7. Linux用户及用户组设置
  8. Photoshop 入门教程「3」如何缩放和平移图像?
  9. Android ASCII编码转换成相对应字符
  10. 《软件工程之美》打卡第六周
  11. 十次方——父工程子模块、公共模块
  12. linux防火墙状态centos6一下,CentOS6.5查看防火墙的状态
  13. Android JNI的调用
  14. html table 斜线表头,Table表格加斜线表头
  15. 芯片前沿 | 云端芯片功耗问题日益严重
  16. 进制为2的10次方的世界
  17. Python几种基本的字符串格式化方法
  18. 路由控制——ACL、IP-Prefix List
  19. Htmlunit 使用总结
  20. c语言文件文件操作详解

热门文章

  1. Nginx的介绍与使用
  2. TCP三次握手的目的及其工作原理
  3. flutter中好用的Widget-CupertinoPicker
  4. swipecell样式_反馈组件 SwipeCell 滑动单元格 - 闪电教程JSRUN
  5. 中国LED芯片行业市场竞争状况分析及十si五发展趋势研究报告2021~2027年
  6. coreldraw铺花纹_CorelDRAW打造漂亮剪纸花纹教程
  7. 传智java测试题答案_传智播客Java基础第一阶段习题
  8. pandas批量拆分、合并EXCEl
  9. 删除mysql中的函数
  10. Java+SSM网上订餐系统点餐餐厅系统(含源码+论文+答辩PPT等)