当前位置: 首页 > news >正文

【EVCC/EVSE/V2G/wireshark/TLS1.2/TLS1.3/ISO15118】Wireshark抓取模拟充电ISO15118协议V2G过程中使用TLS加密报文内容的DEBUG方法

最近在使用 MSE102X + GD32F527RS 模拟车辆充电的过程,其中基于 ISO15118 协议,有一段 V2G 的过程,需要使用到 TLS1.2 或者 TLS1.3,抓到的 wireshark 包不好分析交互过程中的数据是否存在异常,或者跟其他的设备进行模拟充电时,无法判断交互数据是否正确,带来了比较大的麻烦。然后从网上找到了方式,可以进行 DEBUG 调试,特此记录下过程和内容,方便有需要的同学后续根据相关方法拓展和调试使用

目录

存在问题

问题处理

WIRESHARK 插件

集成修改

功能验证

可能存在问题及处理

存在问题

完整的交互流程,可以参考 EVCC/EVSE充电全过程

在模拟车辆充电过程中,V2G使用TLS1.2或者TLS1.3,在构建会话后,所有应用数据都使用了秘钥进行加密,后续无法查看交互报文,导致无法判断交互报文是否正常。

可以看到,当 V2G 建立起来之后,后续的所有报文,都使用了 TLS1.2 进行加密,如果想要从 wireshark 中查看 DEBUG 看相关的交互流程或者报文是否正确,就会变得比较麻烦。

从报文解析也可以看到,报文内容都是经过了加密,导致无法详细查看 DEBUG 看报文是否正常

问题处理

是否有办法能够在 wireshark 中,通过一些手段或者方式,帮忙解析或者查看相关报文?

方法是有的,不过需要注意!!!

此方法仅用于调试、测试阶段使用,严禁在生产环境中使用,有可能导致秘钥泄露

WIRESHARK 插件

这里要使用到的 WIRESHARK 叫做 v2gtlssecret

这个 dSPACE 公司为 Wireshark 开发的一个插件(属于 dsV2Gshark 工具集)中的一个协议解析器(Dissector)它的核心功能是实现V2G(车联网)通信中TLS流量的实时解密,它本身不是一种你需要主动“拼装”的通用通信协议,而是一种用于实时传递TLS会话密钥的、特定格式的UDP报文。你需要做的,是按照它规定的格式,构造并发送UDP数据包。

需要注意的是,该插件在 wireshark 3.5.0 或者更高版本才支持!

这个工具的格式报文如下:

v2gtlssecret插件通过解析特定的UDP数据包来获取密钥。该UDP报文需满足以下要求:

  • 传输层:使用UDP协议。

  • 源端口:通常在49152-65535的临时端口范围内。

  • 包大小:有效载荷(Payload)大小在175 到 1800 字节之间。

  • 内容格式:有效载荷为ASCII 文本,其格式遵循Wireshark的NSS Key Log 格式

其核心内容是一行文本,格式为:<标签> <客户端随机数> <密钥>

TLS 1.2:使用CLIENT_RANDOM标签

CLIENT_RANDOM <32字节客户端随机数(十六进制)> <48字节主密钥(十六进制)>

TLS 1.3:根据密钥用途使用不同标签,如CLIENT_HANDSHAKE_TRAFFIC_SECRET、SERVER_TRAFFIC_SECRET_0

<TLS1.3标签> <32字节客户端随机数(十六进制)> <密钥(十六进制)>

这里以 TLS1.2 为例,简单阐述下该插件运行逻辑

1、该插件严格依赖于从完整的 TLS 握手过程中提取关键信息

2、针对 TLS1.2,该插件会从 "Client Hello" 消息中,获取 client_random 字段

3、然后根据 SSLKEYLOGFILE 中的 client_random 和 Pre-Master Secret 来推导会话秘钥

集成修改

1、该插件在 wireshark 3.5.0 或更高版本中以及集成,插件无需单独安装

2、我们需要按照规定的格式,使用 UDP 将 TLS1.2 中的 CLIENT_RANDOM 或者 TLS1.3 中的 CLIENT_HANDSHAKE_TRAFFIC_SECRET/SERVER_HANDSHAKE_TRAFFIC_SECRET、CLIENT_TRAFFIC_SECRET_0/SERVER_TRAFFIC_SECRET_0 发送出来即可。

3、因为我们自己的 SDK 使用的 MbedTLS 软件加解密方式,可以直接使用对应的回调即可,所以这里的修改都是按照 MbedTLS 的方式修改

①使用的回调接口 mbedtls_ssl_set_export_keys_cb,这里需要注意,需要将对应的 MbedTLS 的宏打开,包括但不限于 MBEDTLS_SSL_SESSION_TICKETS

②配置导出秘钥位置:需要注意,这里配置需要放置在交互之前,否则可能因为流程不完整,无法导出或者导出失败

③注册回调函数

// 发送 UDP 报文(IPv6 组播示例) static void v2g_udp_send_nss_key_log(const char *line, uint16_t len) { int sock = -1; struct sockaddr_in6 src_addr, dst_addr; if (line == NULL || len == 0) return; sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); if (sock < 0) { UNI_LOG_WARN("Init Socke Err"); return; } // 绑定源端口(必须为 49152-65535) uni_memset(&src_addr, 0x00, sizeof(struct sockaddr_in6)); src_addr.sin6_family = AF_INET6; src_addr.sin6_port = htons(NSS_KEY_SRC_PORT); src_addr.sin6_addr = in6addr_any; if (bind(sock, (struct sockaddr *)&src_addr, sizeof(src_addr)) < 0) { UNI_LOG_WARN("Bind Err"); close(sock); return; } // 目标地址 uni_memset(&dst_addr, 0x00, sizeof(struct sockaddr_in6)); dst_addr.sin6_family = AF_INET6; dst_addr.sin6_port = htons(NSS_KEY_DST_PORT); dst_addr.sin6_scope_id = uni_netif_get_scope_id(uni_netif_get_handle()); if (inet_pton(AF_INET6, NSS_KEY_MCAST6_ADDR, &dst_addr.sin6_addr) != 1) { UNI_LOG_WARN("inet_pton Err"); close(sock); return; } if (-1 == sendto(sock, line, len, 0, (struct sockaddr *)&dst_addr, sizeof(dst_addr))) { UNI_LOG_WARN("Send to Sock: %d, %d err", sock, len); } close(sock); }
void mbedtls_v2g_key_export_callback(void *p_expkey, mbedtls_ssl_key_export_type secret_type, const unsigned char *secret, size_t secret_len, const unsigned char client_random[32], const unsigned char server_random[32], mbedtls_tls_prf_types tls_prf_type) { // 将 client_random 转为十六进制 char key_line[2048] = {0}; const char *label = NULL; char *client_hex = NULL, *secret_hex = NULL; int total_len = 0; client_hex = bin_to_hex(client_random, 32); if (client_hex == NULL) { UNI_LOG_ERROR("Client hex err"); goto EXPORT_FINISH; } // 将 secret 转为十六进制 secret_hex = bin_to_hex(secret, secret_len); if (secret_hex == NULL) { UNI_LOG_ERROR("Secret hex err"); goto EXPORT_FINISH; } // 根据 secret_type 判断是 TLS 1.2 还是 1.3,并确定标签 switch (secret_type) { // ----- TLS 1.2 ----- case MBEDTLS_SSL_KEY_EXPORT_TLS12_MASTER_SECRET: // TLS 1.2 使用 CLIENT_RANDOM 标签 label = "CLIENT_RANDOM"; break; // ----- TLS 1.3 握手密钥 ----- #ifndef CONFIG_EVSE_ROLE case MBEDTLS_SSL_KEY_EXPORT_TLS1_3_CLIENT_HANDSHAKE_TRAFFIC_SECRET: label = "CLIENT_HANDSHAKE_TRAFFIC_SECRET"; break; #endif #ifdef CONFIG_EVSE_ROLE case MBEDTLS_SSL_KEY_EXPORT_TLS1_3_SERVER_HANDSHAKE_TRAFFIC_SECRET: label = "SERVER_HANDSHAKE_TRAFFIC_SECRET"; break; #endif // ----- TLS 1.3 应用密钥(0-RTT 和 1-RTT) ----- case MBEDTLS_SSL_KEY_EXPORT_TLS1_3_CLIENT_APPLICATION_TRAFFIC_SECRET: label = "CLIENT_TRAFFIC_SECRET_0"; break; case MBEDTLS_SSL_KEY_EXPORT_TLS1_3_SERVER_APPLICATION_TRAFFIC_SECRET: label = "SERVER_TRAFFIC_SECRET_0"; break; // 其他类型(如 early 密钥)可按需扩展 default: label = NULL; goto EXPORT_FINISH; } // 如果是 TLS 1.3 的某个密钥,构造对应行 if (label != NULL) { total_len = snprintf(key_line, sizeof(key_line), "%s %s %s", label, client_hex, secret_hex); if (total_len > 0) { v2g_udp_send_nss_key_log(key_line, total_len); UNI_LOG_INFO("NSS KEY LOG(%d): %s", total_len, key_line); } } EXPORT_FINISH: if (secret_hex) uni_free(secret_hex); if (client_hex) uni_free(client_hex); }

功能验证

1、从 wireshark 中,可以抓到对应的 V2G Secret 报文

2、查看报文是否可以看到内容

从下图可以看到,后续的交互报文都已经可以看到,并且解析出对应的报文内容,预期实现完成

可能存在问题及处理

存在问题:在实际过程中,可能出现了以下情况:一个方向解析是正常的,另外一个方向无法解析,还是使用了 TLS 进行了加密

问题原因:在Wireshark中,解密引擎按数据包处理TLS记录。如果TCP流由于丢失或无序数据包而中断,Wireshark将无法知道后续数据包的TLS记录起始位置(长度字段被加密,或者它丢失了先前数据包的尾部)。而在我们的报文中,交互流程中,TCP 包出现了异常,导致后续的交互存在异常而引起此问题。

修复方式:找到 wireshark -> 编辑 -> 首选项 -> Protocols -> TLS,按照如下修改即可

http://www.jsqmd.com/news/1338722/

相关文章:

  • Office界面定制终极指南:零代码打造个性化办公环境
  • 抖店超时发货赔付规则详解,一件代发商家如何有效规避超时赔付罚款 - 黑犀AI
  • 拒绝套路与模板:通化 网站建设 如何真正助力本地中小企业破局增长与品牌突围
  • 炉石传说HsMod插件:重新定义你的游戏体验的终极工具箱
  • 手写一门脚本语言 PlayScript:从词法到解释执行的编译器前端实战
  • 火绒安全软件深度配置与排错:从HIPS原理到实战应用指南
  • 2026年储能行业必看:船型开关厂家这样选,省心又可靠
  • 2026年全国发电机回收商家哪家专业 靠谱机构推荐 - 奔跑123
  • S32DS工程创建实战:从RTD-SDK配置到代码框架解析
  • 数据一致性对比实战——千万字段级的数据校验,怎么对
  • G-Helper终极指南:如何用不到10MB的工具彻底解放华硕笔记本性能
  • 【旧衣服回收上门取件怎么收费?2026年最新行情+避坑指南】 - 快递物流资讯
  • 2026年湖州酒店玻璃隔断口碑推荐:本地业主严选6家优质方案,装修避坑指南 - geo交流
  • 终极炉石传说游戏增强指南:55项功能提升你的游戏体验
  • 权限不足问题深度解析:从身份验证到资源访问的系统性排查指南
  • 从录音到母带:专业翻唱制作全流程技术拆解
  • 北京奔驰专属改装门店:韩少改装,十余年深耕奔驰一站式升级服务 - 国麟测评
  • Godot 4 TileMap分层与Y-Sort:2D游戏角色遮挡渲染终极方案
  • Matlab R2022b 安装与配置全攻略:从下载到性能优化
  • 蓝绿、灰度、金丝雀到底怎么选?我在云服务器上把它们全部实测了一遍
  • Arduino Uno R3 从零到精通的完整学习路径与实战指南
  • 硬件工程师进阶:从电路设计到指令集架构的认知跨越与实践指南
  • 2026年常州车牌识别电动门电话优选指南:3个关键点帮你精准选择 - geo交流
  • HsMod:炉石传说终极增强插件,55项功能彻底改变你的游戏体验
  • 汕头瓷砖空鼓松动不用全砸!全屋瓷砖翘边、起拱、渗水完整维修科普 - 宅安选房屋修缮
  • 食品经营许可证遗失怎么登报挂失?办理要求、渠道及完整操作指南 - 信息快递
  • 轻量级殡葬服务App开发与运营实战
  • 【武威市】2026CPPM采购经理报考指南|正规机构甄选产业适配全攻略 - 中采供培
  • 【2027最新】基于SpringBoot+Vue的作业管理系统管理系统源码+MyBatis+MySQL
  • IT工程师职业发展:技术深度与沟通广度的动态平衡策略