前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >修改openssl源码控制ssl握手过程

修改openssl源码控制ssl握手过程

原创
作者头像
angelo
发布2019-07-22 17:48:43
5.1K0
发布2019-07-22 17:48:43
举报
文章被收录于专栏:CDN_NewCDN_New

上篇文章 结尾说道使用openssl s_client命令无控制握手过程,本篇将使用修改源码方式控制ssl握手过程

说明:本篇文章继续上篇文章的openssl环境进行

握手过程

代码语言:txt
复制
cd /data/angelotong/openssl/openssl-master/apps
time ./openssl s_client -debug -connect 14.152.86.41:443 -showcerts -prexit -servername appdlssl.dbankcdn.com -state -tls1_2>/dev/null

可以看到ssl具体握手过程:

image.png
image.png

源码分析

打开s_client.c,进入s_client_main函数:

image.png
image.png

从890~2975行,初始化环境,并根据./openssl s_client传入的参数 设置握手信息。

1903行,SSL_CTX_set_info_callback(ctx, apps_ssl_info_callback);

此处设置握手时每个步骤都会执行的回调函数,参见文档,也就是说每个握手执行后,都会调用这个函数。

image.png
image.png
image.png
image.png

从2975行开始,是一个for (;;)状态机,执行握手,数据传输时的状态转换。

下面不远处,2915行,真正开始SSL握手,文中指定了握手协议使用TLSv1.2。

image.png
image.png

源码修改

上面说到回调函数apps_ssl_info_callback,我们可以在这个回调函数里控制ssl握手过程,如client接收到server hello之后,执行sleep,探测服务端握手超时时间:

代码语言:txt
复制
vim apps/s_cb.c
image.png
image.png

apps_ssl_info_callback功能很简单,调用SSL_state_string_long(s)来得到当前握手的步骤,包括:

代码语言:txt
复制
SSL_connect:before SSL initialization
SSL_connect:SSLv3/TLS write client hello
SSL_connect:SSLv3/TLS write client hello
SSL_connect:SSLv3/TLS read server hello
...
SSL_connect:SSLv3/TLS read server certificate
SSL_connect:SSLv3/TLS read server key exchange
SSL_connect:SSLv3/TLS read server done
SSL_connect:SSLv3/TLS write client key exchange
SSL_connect:SSLv3/TLS write change cipher spec
SSL_connect:SSLv3/TLS write finished
SSL_connect:SSLv3/TLS write finished
SSL_connect:SSLv3/TLS read server session ticket
SSL_connect:SSLv3/TLS read change cipher spec
SSL_connect:SSLv3/TLS read finished

修改apps_ssl_info_callback函数,加入:

代码语言:txt
复制
    if(strcmp(SSL_state_string_long(s), "SSLv3/TLS write client key exchange") == 0){
        sleep(59);
    }

这里的sleep(59)可以让握手过程中client接收到server hello之后,等待一段时间再向server发送write client key exchange :

image.png
image.png

重新编译

保存上面修改,重新编译:

由于我们之前执行过config,并且不需要安装,所以仅执行make就可以:

代码语言:txt
复制
cd /data/angelotong/openssl/openssl-master
make -j 48

gdb调试

开始调试

代码语言:txt
复制
cd apps
gdb ./openssl
run s_client -debug -connect 14.152.86.41:443 -showcerts -prexit -servername appdlssl.dbankcdn.com -state -tls1_2>/dev/null

可以看到客户端收到server hello后,59s后才执行client key exchange

image.png
image.png

可以看到,server等待59s后收到client key exchange操作,仍可以继续进行sll握手

修改sleep(59)为sleep(61),再次执行,发现server返回ssl握手失败

image.png
image.png

结论:server端握手超时时间为60s。

抓包分析

在我们上面设置sleep(59)前,开始抓包:

代码语言:txt
复制
tcpdump -i eth0 host 14.152.86.41 -w baidu.pcap

抓包继续,将sleep时间设置为61,重新编译运行。

使用wireshark打开刚刚抓的包,第一次sleep(59)时握手成功:

image.png
image.png

第二次sleep(61),握手失败,再次验证了server端握手超时时间为60s的结论。

image.png
image.png

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 握手过程
  • 源码分析
  • 源码修改
  • 重新编译
  • gdb调试
  • 抓包分析
相关产品与服务
SSL 证书
腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档