脸书对外开源其新一代传输层安全性TLS 1.3协议函数库Fizz,脸书提到,现在他们有一半以上的互联网流量皆以TLS 1.3保护,每秒处理数百万次TLS交握,而新协议的功能0-RTT不仅降低了延迟,也替脸书每天减少数万亿的服务请求CPU使用率。通过开源Fizz,脸书要让TLS 1.3更加普及。
TLS 1.3在今年3月底时已经拍板定案,重要的功能包括加密交握消息,以确保凭证私密性,还重新设计了密钥导出方法,并且加入降低延迟的0-RTT(Zero Round Trip Time Resumption)技术。 TLS 1.3不只提供最新的安全加密技术,还能减少延迟和计算资源使用率,因此对于拥有超过十亿用户的脸书来说,部署TLS 1.3成为一件重要的事,脸书为此开发了自家的TLS函数库Fizz。
Fizz以C++ 14撰写而成,是一个主打高性能且多功能的TLS函数库,现在脸书在全球的移动应用程序、HTTP函数库与服务器Proxygen、企业内部服务甚至是QUIC和mvfst,全都部署了Fizz和TLS 1.3,大规模采用的情况下,脸书有超过50%的流量都以TLS 1.3保护,并且脸书还使用了TLS 1.3的最新功能0-RTT ,来减少服务延迟。
性能一直是加密的权衡要点之一,互联网工程任务小组(Internet Engineering Task Force,IETF)在订定TLS 1.3协议时,也把性能考虑进去。脸书与IETF长期密切合作,在增加TLS安全性的同时,也没有忽略性能的重要性,过去他们使用了自定义的零协议(Zero Protocol),率先实验创建0-RTT安全连接。使用0-RTT数据可以减少部署TLS的带来的请求延迟,以及延迟成本开支,脸书现在以TLS 1.3取代了自行开发的零协议。
脸书分析到,与TLS 1.2相比,TLS 1.3早期数据(Early Data)在创建安全连接时,延迟明显减少,这能大幅提升用户经验,尤其在应用程序冷启动,尚未存在任何可重复使用的连接时。脸书公布其在Android平台的应用程序测试结果,TLS 1.3早期数据比起TLS 1.2,在第50百分位数,连接创建阶段延迟可以减少46%,而在新连接HTTP请求延迟则减少10%。
Fizz提供了易于使用的API,让开发者可以在TCP连接创建后,立刻送出早期数据,而从脸书提供的数据显示,这对于减少移动设备应用程序的冷启动延迟非常重要。但脸书提醒,早期数据有其风险,因为黑客能够轻易通过重播数据,来让服务器重复处理工作,为了降低这个攻击风险,脸书只发送在特定白名单中的请求作为早期数据,并且在负载平衡器中部署了重播缓存,用来侦测并拒绝数据重播。
另外,Fizz还提供了零复制写入功能,进一步提升了加密应用性能。脸书提到,不少支持TLS的函数库都要求用户提供完整连续的内存区块,TLS函数库会加密这些数据并且写入到Socket中,但通常设备中,应用程序会使用多个内存区块保存数据,因此应用程序需要把这些数据复制到连续的内存区块,供TLS函数库加密使用,而搬移数据的动作,增加了延迟开支。
而对于分散或是单一区块的内存数据,Fizz都能良好的处理,该函数库提供I/O的API,默认接受分散与聚集抽象输入,因此即便数据散落在内存各处,应用程序也不须要再花一道手续集中数据,不只更省时间,也减少了复制所占用的内存,因此Fizz能以更省的硬件资源处理加密工作。
脸书提到,TLS状态机很复杂,过去的漏洞都发生在TLS实例中的状态机。而Fizz为了管理复杂的TLS状态机,让状态机信息外显,也就是说状态机的状态被定义在单一位置,并根据收到的消息转换状态,脸书提到,将状态明确定义在单个位置就可以解决这类安全问题。
脸书在部署TLS 1.3并不顺利,遇到非常多的问题,不少是发生在互联网中介设备上,可能由于对TLS不容错,而抛弃TLS协议交握或是重置连接。脸书通过与Firefox和Chrome合作,在多个协议变体上实验,在Fizz上修正了交握方法,并增加了数个变通方法来减少网络中介设备对于早期数据的干扰,因此Fizz现在已经能非常强健的处理TLS协议工作。