curl - 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 字段。
所以有人知道问题是什么吗?
解决方案
好的,使用 OpenSSL 的 curl 似乎禁用了 lib/vtls/openssl.c 中的票证。前面的注释块表明这是由于某种原因由补丁添加的,但我没有查看提交历史来找出什么;它确实断言您可以使用 SSL 回调更改它。
注意 OpenSSL 1.1.1 支持 TLS1.3,除非您禁用它,否则只要服务器同意,就会使用它。TLS1.3 不再使用旧式 (RFC4507/5077) 票证,并且根本不再使用 session-id 或票证恢复旧式会话。相反,它有一个使用临时派生的 PSK 的新的前向秘密方案;这使用了以前用于票证的消息类型“NewSessionTicket”,但它不再包含票证,并且不再依赖于 hello 中的“票证”扩展。有关详细信息,请参阅 RFC8446。
推荐阅读
- ios - UINavigationBar 标题未水平居中
- python - 从 ID 列表中获取文档列表
- app-inventor - 无法在 MIT App Inventor 2 中汇总数据
- javascript - 为什么我的 RegEx 可以在 PHP 中工作,但不能在 JavaScript 中工作?
- python - 向 Python AWS Lambda 错误消息添加字段
- java - 是什么阻止我使用我创建的对象数组?
- javascript - 传递编码的 url 时找不到资源
- visual-studio-code - 如何在 Visual Studio 代码中格式化大括号
- ibm-case-manager - IBM Case MANager EDS 填充网格
- algorithm - 仅使用加法、乘法、减法和最大值的整数除法