注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

^_^ china.ygw的博客

软件开发/c/c++/数据库/开源/linux/windows/安全/网络...

 
 
 

日志

 
 
 
 

基于1.54.0版本boost的ssl握手提示“no shared cipher”问题及解决  

2013-08-09 22:59:30|  分类: boost |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

        这几天,使用1.54.0版本boost进行ssl握手时,服务端调用异步握手接口async_handshake总是提示“no shared cipher”错误,具体环境如下:
        1)硬件平台:power ppc
        2)操作系统: 自定义linux
        3)boost版本: 1.54.0
        4)openssl版本: 1.0.1e
        ssl代码参考的是boost文档中asio资料中的ssl服务端例子,然后使用openssl生成了模长为2048的RSA根密钥ca_key.pem和证书ca_cert.pem、服务端密钥server_key.pem及证书server_cert.pem、客户端密钥client_key.pem及证书client_cert.pem。
        在运行程序之前,首先使用openssl自带的s_client与s_server进行了测试,确认双方基于ssl3版本的交互OK,使用的密码套件为ECDHE-RSA-AES256-SHA。相应的测试命令为:
        1)测试服务端s_server运行命令如下:
            openssl s_server -ssl3 -accept 12345 -CAfile /tmp/ca_cert.pem -cert /tmp/server_cert.pem -key /tmp/server_key.pem -debug
        2)测试客户端s_client运行命令如下:
            openssl s_client -ssl3 -connect 127.0.0.1:12345 -CAfile /tmp/ca_cert.pem -cert /tmp/server_cert.pem -key /tmp/server_key.pem -debug
        然后使用openssl自带的s_client程序连基于boost开发的ssl服务端程序,很遗憾,no shared cipher报错。
        有问题肯定最先想的是最简便的解决方式,所以立马google。不过很可惜,搜索出来的页面还是比较多,说的原因也很简单,客户端与服务端交互所使用的密码套件对不上。好比是你用AES加密,但是我只支持DES。而且绝大多数搜索结果都是与使用具体软件有关,不是基于代码实现产生的问题。
        捷径没有了,没办法,只有自己再慢慢摸索了:
        1)首先,把openssl编译为debug版本(修改openssl源代码根目录下的Configure文件,找到第一次出现的linux-ppc行,将行中的-O3修改为-g,然后重新编译openssl);
        2)将自己的程序也开起,把openssl自带的s_server也开起,两边一起调试,看数据有何差异。随着调试的不断深入,发现在调用ssl/s3_lib.c文件中ssl3_choose_cipher函数3814行的ssl_set_cert_masks(cert, c)指令时,两者的cert内容有区别。s_server中,cert的很多成员都有值,而自己的程序则为空值;
        3)s_server有值,说明调用了相关指令进行了赋值。而自己的程序由于参考boost自带的例子,其当前版本支持的ssl接口还比较少,更多的可能还需要单独调用openssl相关接口。想到这,从发现问题的地方往前推。最终发现s_server单独调用了一些设置cert成员的命令,导致其有值,而我的程序没有调用类似指令,cert成员没有值;
        4)抱着试一试的心态,在握手前,手工设置boost::asio::ssl::context成员的tmp_ecdh(临时的椭圆曲线Diffie-Hellman 密钥协商协议)值,代码如下:
            EC_KEY *ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
            SSL_CTX_set_tmp_ecdh(m_context.native_handle(), ecdh);
            EC_KEY_free(ecdh);
        令人激动人心,no shared cipher问题已经自己悄悄地溜走了,呵呵!
        时间不长,花了一天左右时间在调试openssl并跟踪记录,看来gdb的利器确实是攻无不克啊^_^
  评论这张
 
阅读(654)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018