C语言使用openssl库解析TLS报文(SNI和证书)

本文档详细记录了使用openssl库解析TLS流量中SNI字段和证书的过程,包括SNI的提取、证书的解析以及相关源码分析。作者分享了在项目中遇到的挑战和解决方案,如通过阅读源码理解openssl结构并实现不依赖SSL连接的SNI解析。此外,还介绍了证书的有效期验证和证书链的创建。

文章目录

前言

一、需求概述

二、总体设计

1.SNI字段的过滤

2.证书的解析

总结


2023.1.11更新:

首先痛批各大网站的爬虫,直接把这篇文章拉到自己的平台中,而且还要收费???(某库)

根据这段时间的积累,我还是发现openssl官方代码中还是涉及到SNI解析的源代码,路径为:

openssl/ssl/statem/extensions_srvr.c,其中的关键函数为tls_parse_ctos_server_name.

如下图所示:

我从代码的一点点分析中发现,其中报文解析的关键数据结构为PACKET结构体,定义在ssl/packet_locl.h头文件中,如下图所示:

 从中可以发现,其中还提供了PACKET结构体操作的各种函数,而且openssl官方代码中解析报文的函数大致均出自这里!!!(tls_parse_ctos_server_name函数中所用的PACKET_get_1之类的函数均出自这里)

到这里,我就又有了新的想法:将此结构体相关的函数拷贝出来,替换之前的写法,解析起来不就更安全、更不容易出错了嘛!我们可以看到,此头文件依赖于internal/numbers.h头文件,我们同样将其拷贝到项目中进行使用,同时,numbers.h又不依赖于其他的openssl内部头文件,那我们的项目结构(GitHub - CChuancey/Protocol_Restoration: tcp流的乱序重组、http与tls应用层)变化如下:

 同时,CMakeLists.txt中添加相关依赖就可以直接使用了!

最后,我已将基于Openssl库中PACKET结构体解析SNI的代码提交至Github仓库(具体位置为src/tls.cpp中的get_server_extension_name_by_openssl函数),欢迎Star!

GitHub - CChuancey/Protocol_Restoration: tcp流的乱序重组、http与tls应用层

说明:以上代码来自官方openssl 1.1.1s源代码,感谢FuXiao在Github仓库中提出的Issues!


前言

项目中需要对TLS报文中SNI和证书部分进行过滤,并且之前并没有接触过这方面的内容,为了解决这一需求,期间学习了不少知识,也走了不少弯路。就写下这篇博客记录分享一下。

项目背景:项目是一个类似防火墙的软件,可以过滤特定的TLS流量。实现原理就是通过对TLS数据包流量进行解析,得到想要过滤的字段数据,根据过滤规则决定是否放行该TLS流量。


一、需求概述

本次需要过滤的TLS数据包主要针对SNI和证书,TLS报文的版本为1.2。使用版本为1.0.2k的openssl库进行C编程。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值