Skip to content

getSslSessionId() 会话 ID ​

🔑 取 SSL 对象对应的会话 ID,返回十六进制大写字符串。

📎 源码在线查看:script.js#L254-L276(getSslSessionId)

签名 ​

javascript
function getSslSessionId(ssl)
// 返回 "59FD71B7..." 或 0
参数含义
ssl指向 SSL 对象的指针(即 SSL_read/SSL_write 的第一个参数 args[0])

用途 ​

会话 ID 用于在 pcap 文件里把同一次 SSL 会话的多个收发包关联到同一条 TCP 流。Python 端 log_pcap 用它作为 ssl_sessions 字典的 key,为每条会话维护模拟序列号。

实现 ​

javascript
function getSslSessionId(ssl) {
  var session = SSL_get_session(ssl);   // SSL -> SSL_SESSION*
  if (session == 0) {
    return 0;
  }
  var len = Memory.alloc(4);
  var p = SSL_SESSION_get_id(session, len);  // session -> id字节指针, len写出
  len = len.readU32();
  var session_id = "";
  for (var i = 0; i < len; i++) {
    session_id +=
      ("0" + p.add(i).readU8().toString(16).toUpperCase()).slice(-2);
  }
  return session_id;
}

调用链 ​

三个 Native 调用 ​

函数签名作用
SSL_get_session(ssl)pointer(ptr) -> pointer从 SSL 对象拿会话对象
SSL_SESSION_get_id(session, &len)pointer(ptr, ptr) -> pointer拿会话 ID 字节,len 写出
Memory.alloc(4) + readU32—给 &len 准备 4 字节空间再读回

十六进制拼接 ​

javascript
("0" + p.add(i).readU8().toString(16).toUpperCase()).slice(-2)
  • readU8() 读 1 字节(0~255)
  • .toString(16) 转 16 进制字符串(可能 1 位或 2 位)
  • 前面补 "0" 再 .slice(-2) 取后 2 位 → 保证 2 位(0xAB → "AB",0x5 → "05")
  • .toUpperCase() 大写

session == 0 的处理 ​

若 SSL_get_session 返回 0(无会话,如未完成握手),直接返回 0。Python 端会得到 ssl_session_id=0,pcap 里这条包会被归到一个单独的"0 会话"流。

相关文档 ​

基于 VitePress 构建 · 教学用途