首页 > 解决方案 > libcurl发起https请求时,客户端hello不携带session ticket字段

问题描述

#include <curl/curl.h>

int main()
{
    curl_global_init(CURL_GLOBAL_ALL);
    CURLSH *sh = curl_share_init();
    curl_share_setopt(sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
    CURL *curl = curl_easy_init();
    curl_easy_setopt(curl, CURLOPT_SHARE, sh);
    curl_easy_setopt(curl, CURLOPT_URL, "https://xxx");
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
    
    auto ret = curl_easy_perform(curl);
    
    curl_share_cleanup(sh);
    curl_easy_cleanup(curl);
    curl_global_cleanup();
    return 0;
}

我试过openssl s_client -connect xxx:443 了,这种方式的客户端hello会携带session的ticket字段,ticket可以正常使用。但是 curl https://xxx 不会携带 session ticket 字段。

所以有人知道问题是什么吗?

标签: curlhttpsopenssl

解决方案


好的,使用 OpenSSL 的 curl 似乎禁用了 lib/vtls/openssl.c 中的票证。前面的注释块表明这是由于某种原因由补丁添加的,但我没有查看提交历史来找出什么;它确实断言您可以使用 SSL 回调更改它。

注意 OpenSSL 1.1.1 支持 TLS1.3,除非您禁用它,否则只要服务器同意,就会使用它。TLS1.3 不再使用旧式 (RFC4507/5077) 票证,并且根本不再使用 session-id 或票证恢复旧式会话。相反,它有一个使用临时派生的 PSK 的新的前向秘密方案;这使用了以前用于票证的消息类型“NewSessionTicket”,但它不再包含票证,并且不再依赖于 hello 中的“票证”扩展。有关详细信息,请参阅 RFC8446。


推荐阅读