kodi优化实践之https优化

Posted by LuckXiang on February 26, 2017

0x00  场景

客户最近反馈开发板上移植的kodi,访问YouTube插件时非常慢,进入某项列表需要24s,对比pc只需要3秒。跟踪代码,发现时间都消耗在了requests接口,该接口是python的http post接口, 通过抓包,发现https过程特别慢,需要进行优化。

0x01 分析

https 是在http的基础上搭了一层ssl/tls协议,整个ssl过程如图所示:

第一步是 client hello,客户端告诉服务器我支持哪些算法,也就是发送一个Cipher(加密套件)列表给服务器,列表中的一个cipher包含以下信息:

  • 1.密钥交换算法,用于决定客户端与服务器之间在握手的过程中如何认证,用到的算法包括RSA,Diffie-Hellman,ECDH,PSK等
  • 2.加密算法,用于加密消息流,该名称后通常会带有两个数字,分别表示密钥的长度和初始向量的长度,比如DES 56/56, RC2 56/128, RC4 128/128, AES 128/128, AES 256/256
  • 3.报文认证信息码(MAC)算法,用于创建报文摘要,确保消息的完整性(没有被篡改),算法包括MD5,SHA等。
  • 4.PRF(伪随机数函数),用于生成“master secret”。 给一个cipher格式’TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA’,这表示基于tls协议,使用ecdhe或rsa作为密钥交换算法,对称加密采用aes256 cbc模式,摘要算法使用sha。

第二步是 server hello,服务器收到cipher后,会从中选择一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给client。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。如果服务端还需要对客户端进行验证,以保证数据传送给了安全合法的客户端。服务端可以向客户端发出Cerficate Request消息,要求客户端发送证书来对对客户端的合法性进行验证。

第三步,客户端对服务器给过来的证书进行检查。

第四步,客户端和服务器互相发送finish数据,验证结束,开始发送应用数据。

由于开发板和pc都是使用openssl的代码,我们首先不怀疑流程和代码本身的问题,而是考虑算法效率的问题。由以上过程可以看到,主要有四个计算环节,密钥交换,证书校验,对称加解密,完整性校验。我们优化的核心就是针对每个过程选择合适的算法。

0x02  优化

抓包可以看到我们的对称加密采用的是椭圆算法,该算法在我们的开发板上效率很慢,通过选择RSA算法,每次https的过程从6秒缩短到了1.5秒,性能有了很大的提升,同时,通过修改openssl的代码,我们可以指定密钥套件,具体每个环节选用什么算法,可以查阅实际资料和实际对比测试,在此不再详细讲述。通过对密钥套件的算法进行芯片级的优化。该问题得到了很好的解决,可以在毫秒级完成任务。当然,除了https的问题,还有其它地方需要优化。留待下回分解。