在asio中使用OpenSSL

由于自己对OpenSSL和密码学什么的还在白痴状态,所以这里只能记录一下一个简单的流程了——从编译OpenSSL到生成证书,然后在asio里面从内存加载证书文件简历安全连接。

1.编译OpenSSL
这个网上一搜一大堆,不过还是记录下吧。首先到OpenSSL官网下载最新的OpenSSL源码(就别用老的了吧,再遇到个HeartBleed啥的也能减少点危害),随便解压到哪。下载安装ActivePerl,并加到PATH环境变量中(有的系统加完要重启电脑才能在cmd中执行perl命令)。完成后,打开VS的开发人员命令提示,CD到OpenSSL根目录,执行以下命令:
perl configure VC-WIN32
ms\do_ms
nmake -f ms\nt.mak
nmake -f ms\nt.mak install

注意最后的nmake -f ms\nt.mak install不能少,这个命令会在源码所在的盘的根目录下新建一个usr目录,头文件库文件还有编译好的openssl.exe都在这个目录里面,而且还有一些配置文件,如果没有这些配置文件,后面生成证书会失败。
如果要编译OpenSSL为dll而不是静态库,把最后两句改成
nmake -f ms\ntdll.mak
nmake -f ms\ntdll.mak install
就好了。如果不出错,OpenSSL就编译完了

2.生成证书
证书这东西我是完全不了解,也完全不知道asio的ssl示例里面的证书是怎么生成的,这个有空还得请教jackarain,再怎么说也是自己发现过OpenSSL的漏洞的人(好口怕啊...囧),在stackoverflow上找了个示例,这个是在linux下的,windows其实也一样,把里面
cp server.key server.key.secure
这一句改成
copy server.key server.key.secure
就可以了,然后按照下面说的修改server.cpp和client.cpp就好了,测试了下么啥问题
3.从内存加载证书
虽然用证书加密了传输内容,但是因为证书暴漏在外面,别人也可以用你的证书来和服务器通信,所以最好是能把证书写到程序里面,然后加个强壳,虽然也不可能完全阻止破解,但只要破解难度过大,超过了破解后带来的利益,那一般就是安全的了,所以需要从内存加载证书,静态链接OpenSSL(要不别人hook一下OpenSSL的相关函数,你的证书内容又完全暴露了),然后加强壳(虚拟机壳啥的,要不IDA看一下字符串就看到证书了)。
废话了这么多,说一下具体该怎么搞吧。貌似老版本的asio没提供直接从内存加载证书的接口,要用OpenSSL自己本身的接口,比较麻烦,新版本的boost(写文章用的1.55,boost官网里面说是1.54添加的)里面的asio直接有从内存加载证书的接口,很简单,把几个加载证书文件的接口换一下就可以了
client.cpp:
load_verify_file替换成add_certificate_authority

server.cpp:
use_certificate_chain_file替换成use_certificate_chain
use_private_key_file替换成use_private_key
use_tmp_dh_file替换成use_tmp_dh
除了client里面的那个函数没法通过函数名来联想到,其他的函数都是把原来函数的_file去掉了而已。这些函数都是把原来要求输入文件名的参数换成了boost::asio::const_buffer,用一个字符串(证书内容)创建个buffer传进去就好了,另外boost 1.54版本里面的asio添加的关于从内存加载证书的函数一共有六个,具体自己看这里吧。

最后吐槽下我在找asio从内存加载证书的东西时,在stackoverflow上看到有人也在问,不过都没人知道load_verify_file对应的函数是哪个,我搞明白了之后就注册了个号去回答了一下,结果因为引用了csdn的一片文章(文章内容是转载的一个英文文章,应该不是看不懂的原因),所以被人踩了,然后标记为删除了..让我把文章内容贴上去,不知道是不是他们访问不了csdn。后来我发现CSDN那篇文章其实就是转的stackoverflow上的一个回答(我在这篇博文中引用的这个),我那个汗...算了懒得折腾了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Boost.Asio是一个用于异步网络编程的C++库。它基于I/O services和I/O objects的概念,其I/O services提供异步数据传输的能力,而I/O objects用于初始化特定操作,如TCP socket。Boost.Asio提供了一个类实现I/O services,即boost::asio::io_service,以及多个I/O objects对象,如boost::asio::ip::tcp::socket和boost::asio::deadline_timer。通过使用Boost.Asio,可以实现异步操作,提高程序的性能和响应能力。 在使用Boost.Asio开发应用程序时,需要注意的是,调用那些需要较长时间才返回的函数时,返回的顺序可能是无序的,这是因为Boost.Asio采用了异步操作。为了处理异步操作的完成,可以使用handler函数的形式来实现。然而,这种方法可能会导致代码的理解和维护变得更加困难。 此外,Boost.Asio还可以与其他Boost库一起使用,如Boost.System、Boost.Regex、Boost.DateTime和OpenSSL,以提供更多的功能和支持。 总之,Boost.Asio是一个强大的C++库,用于实现异步网络编程,并提供了丰富的功能和支持。 #### 引用[.reference_title] - *1* *2* [Boost Asio介绍](https://blog.csdn.net/feikudai8460/article/details/107771155)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Boost.Asio简介](https://blog.csdn.net/fron_csl/article/details/49074199)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值