当前位置: 首页 > 科技观察

curl即将支持HSTS

时间:2023-03-13 11:57:46 科技观察

全HTTPS是目前互联网的共识,基本上所有的浏览器都已经表明使用HTTP协议或者部分HTTPS的站点是不安全的。而且,要实现全HTTPS还有一个关键协议,那就是HSTS协议,而HSTS依赖于各种Web服务器和浏览器客户端的支持。在本文中,我们将讨论即将发布的Curl7.74中对HSTS的支持。概述HSTS(HTTPStrictTransportSecurity,HTTPStrictTransportSecurityProtocol,是网站的标准HTTP响应头,用于通知客户端在指定时间内,主机不接受纯HTTP访问,只使用HTTPS进行访问access.该协议在2012年的RFC6797中提出,由于历史原因或者兼容性问题,网站可能支持同时通过HTTP和HTTPS访问服务器资源,对于http请求通过301/302跳转到https,这样HSTS和浏览器预加载HSTS主要通过服务器端发送Strict-Transport-Security头来控制浏览器操作:首先添加HSTS响应头到服务器响应头:Strict-Transport-Security:max-age=expireTime[;includeSubDomains][;preload]此响应头仅在访问https时生效,其中[]中的参数是可选的;themax-age参数为设置时间,建议为6个月,即15552000秒。一个典型的nginx设置是server{…add_headerStrict-Transport-Security”max-age=15552000;includeSubDomains;preload”;…}当用户下次使用HTTP访问时,客户端浏览器会进行内部跳转到307重定向外网无需任何HTTP请求即可直接访问HTTPS。启用HSTS后,网站可以有效防止中间人劫持,无需301/302重定向即可提升网站性能和用户访问体验。HSTSStrict-Transport-SecurityHTTP标头是流行浏览器中的预加载列表之一。您可以使用它们来预加载站点的系统设置。浏览器在首次启动时就已经知道其站点的HSTS状态。HSTS在Curl中的实现预计从2020年12月发布的curl7.74.0开始。Curl开始提供HSTS实验性支持,默认情况下不会启用,没有。您可以使用参数--enable-hsts手动启动curlHSTS,使用--hsts配置HSTS信息加载/保存缓存到文件,HSTS将在退出时缓存和更新。如果调用时重复使用同一个缓存文件,通过HSTS头可以有效避免使用明文HTTP访问。此功能也已添加到libcurllibcurl库中,可供使用HTTP(S)传输的应用程序使用。使用libcurl,应用程序可以设置一个文件名以用于加载和保存缓存,并且提供了一些额外的选项以提供更多的灵活性和功能:CURLOPT_HSTS:允许设置一个文件名以从/到/写入HSTS缓存。CURL*curl=curl_easy_init();if(curl){curl_easy_setopt(curl,CURLOPT_HSTS,"/home/user/.hsts-cache");curl_easy_perform(curl);CURLOPT_HSTS_CTRL:为此传输启用HSTS功能。CURL*curl=curl_easy_init();if(curl){curl_easy_setopt(curl,CURLOPT_HSTS_CTRL,CURLHSTS_ENABLE);curl_easy_perform(curl);}CURLOPT_HSTSREADFUNCTION:在传输即将开始时由libcurl调用,并允许应用程序预加载HSTS条目,就好像它们被curl读取并添加到缓存中一样。{/*setHSTSreadcallback*/curl_easy_setopt(curl,CURLOPT_HSTSREADFUNCTION,hstsread);/*将不合适的参数传递给回调*/curl_easy_setopt(curl,CURLOPT_HSTSREADDATA,&hstspreload[0]);result=curl_easy_perform(curl);}:这个回调被调用每当应用程序将缓存保存在某个地方或类似地方时,就会重复。CURL*curl=curl_easy_init();structMyDatathis;if(curl){curl_easy_setopt(curl,CURLOPT_URL,"http://example.com");/*传递给CURLOPT_HSTSREADFUNCTION回调的passpointer*/curl_easy_setopt(curl,CURLOPT_HSTSREADDATA,&thisasycurl);