You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在OpenSSL客户端将旧TLS会话票证应用到新连接?

正确实现OpenSSL客户端TLS会话票证复用的方法

你之前的核心错误在于对客户端会话复用的逻辑理解偏差,以及误用了服务端API,以下是修正方案:

核心错误点

  1. 客户端不能调用SSL_set_accept_state,这是服务端用来监听连接的状态,客户端必须用SSL_set_connect_state
  2. 不需要手动提取票证再尝试解析,票证是SSL_SESSION的一部分,直接保存完整会话对象即可
  3. d2i_SSL_SESSION用于解析完整的DER编码会话结构,不能直接解析票证数据;SSL_set_session_ticket_ext是服务端向客户端发送票证的API,客户端无需调用

正确实现步骤

1. 首次握手后保存有效会话

客户端完成首次握手后,直接提取并保存完整的SSL_SESSION对象(OpenSSL会自动包含会话票证),同时记录有效期判断是否过期:

// 首次连接流程
SSL* ssl = get_my_ssl_connection();
SSL_set_connect_state(ssl);
if (do_handshake() != 1) {
    /* 握手失败处理 */
    return;
}

SSL_SESSION* saved_session = SSL_get_session(ssl);
if (saved_session != NULL && SSL_SESSION_has_ticket(saved_session)) {
    unsigned int lifetime_sec = SSL_SESSION_get_ticket_lifetime_hint(saved_session);
    SSL_SESSION_up_ref(saved_session); // 增加引用计数,避免被OpenSSL自动释放
    // 将saved_session和lifetime_sec存入本地缓存(比如哈希表、文件)
}

2. 新连接复用会话

创建新SSL对象后,直接从缓存中取出未过期的SSL_SESSION,调用SSL_set_session即可,OpenSSL会自动在ClientHello中携带会话票证扩展:

// 新连接复用会话流程
SSL* ssl2 = SSL_new(ctx);
SSL_SESSION* cached_session = get_cached_session(); // 从缓存中获取未过期的会话
if (cached_session != NULL) {
    // 设置会话,成功则握手时会尝试复用
    if (SSL_set_session(ssl2, cached_session) == 1) {
        /* 会话设置成功,等待握手复用 */
    }
    SSL_SESSION_free(cached_session); // 释放缓存中的引用,SSL_set_session已增加新引用
}

SSL_set_connect_state(ssl2); // 客户端必须设置为连接状态
int handshake_ret = do_handshake();
if (handshake_ret == 1) {
    // 检查是否成功复用会话
    if (SSL_session_reused(ssl2)) {
        /* 会话复用成功,握手延迟降低 */
        // 可选:更新缓存中的会话(如果服务器返回了新的票证)
        SSL_SESSION* new_session = SSL_get_session(ssl2);
        if (new_session != NULL) {
            SSL_SESSION_up_ref(new_session);
            update_cached_session(new_session);
        }
    }
}

关键注意事项

  • 会话有效期管理:使用SSL_SESSION_get_ticket_lifetime_hint获取服务器给出的有效期,过期的会话不要复用
  • 引用计数:使用SSL_SESSION_up_ref和SSL_SESSION_free管理会话的生命周期,避免内存泄漏或野指针
  • 自动复用逻辑:OpenSSL会自动处理会话复用的失败场景(比如票证过期、服务器不接受),此时会回退到完整握手,无需额外处理

内容的提问来源于stack exchange,提问作者Mary Chang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 08:25:56