前面说过,TLS/SSL协议可以和应用层协议结合,例如HTTP,SMTP和FTP等。提供数据完整性和机密性TLS/SSL协议建立在TCP或UDP之上,应用层协议之下,任何应用层协议使用了TLS,都要先把数据经过TLS/SSL处理。客户端浏览器连接服务器的443端口,发送HTTP数据到TLS/SSL协议,再到传输层TCP处。TLS协议部分有握手层和加密层两部分,握手层在上,加密层在下,握手层负责完成密码套件,也就是使用的加密算法,密钥参数生成和交换,发送证书等,最后完成密钥协商得到预备主密钥,预备主密钥用过密钥衍生算法得到主密钥,之后就可以把这它交给下面的加密层,完成数据加密和解密。加密层的功能顾名思义,在拿到握手层提供的主密钥后,对HTTP数据提供完整性和机密性保证。
在握手层,负责交换随机数,密钥套件和密钥协商等,无论是RSA还是DH方式,首先都是客户端发送自己支持的密码套件给服务器,服务器从中选择一个密钥套件,完成密码套件的协商,然后服务器端发送自己的证书给客户端进行身份验证,客户端完成身份验证后,可以开始密钥协商。RSA密钥协商,客户端直接把加密后的预备主密钥发送给服务器端,DH密钥协商则先由服务器端发送DH参数和DH公钥给客户端,客户端根据DH参数生成自己的密钥对,再把客户端DH公钥发送给服务器端,完成密钥协商。接下来就可以在通信中进行数据的加密和解密。
前面说的很清楚,握手阶段就是客户端和服务器端进行信息交换,身份验证和密钥协商。
密码套件是各个密码学算法的组合,包括加密算法,密钥协商算法,身份验证算法,HMAC消息验证码算法和PRF伪随机数算法,客户端在连接阶段将自己支持的密码套件发送给服务器端,服务器端从中选择一个自己也支持的密钥套件。来看一个密码套件的例子:
TLS_DH_RSA_WITH_AES_CBC_128_SHA
DH表示使用的DH密钥协商算法,RSA表示身份验证用到的是RSA公钥,例如证书中含有的是服务器的RSA公钥。AEC_CBC_128表示的是使用对称加密AES算法,CBC块密码分组连接模式,密钥长度为128比特。SHA是使用的消息验证码算法。
在一次HTTPS请求中,协商密码套件是必须的,就像密钥协商一样,不要使用固定的一套密码套件,因为一个服务器通常要处理许多的客户端连接,每个客户端所支持的密码套件是不同的,原因是客户端可能运行着不同的操作系统,使用不同的浏览器,不同的运行环境支持的密码套件是不同的,如果使用固定的密码套件,可能会出现某一个算法,在服务器端支持,但在客户端不支持的情况。所以,客户端和服务器端在连接阶段必须协商出一个双方都支持的密码套件。
在客户端和服务器端进行密钥协商交换密钥信息之前,还要进行身份验证,客户端要验证服务器的身份,通过CA证书,证书中包含了服务器公钥和使用的数字签名算法等,当客户端和服务器端协商好密码套件后,服务器端会发送自己的证书给客户端进行验证,客户端进行认证使用的技术就是数字签名技术,数字签名可以做到防抵赖,防伪造,服务器端在申请CA证书时,把自己的公钥和CSR证书请求文件发送给CA机构,CA机构使用自己的私钥对服务器信息进行签名后放在证书中,客户端根据证书验证服务器身份时,使用自己浏览器集成的CA机构根证书,里面包含了CA机构的公钥,使用该公钥解密出服务器证书的公钥信息,最后获得服务器公钥。
通信双方密钥协商最后协商出预备主密钥,预备主密钥用密钥衍生算法得到主密钥,最后拆分成各个密钥块。在HTTPS中密钥协商有RSA和DH两种算法,不过RSA密钥协商算不上真正的协商,预备主密钥可以说是由客户端确定的,从RSA密钥协商过程就可以看出:
可与看到,预备主密钥完全由客户端生成。
DH密钥协商则是真正意义上的密钥协商,协商过程中通信双方各自提供一部分信息,即使中间一部分被截获泄露,也无法计算出预备主密钥,大致过程:
DH密钥协商又可以分为静态DH和动态DH两种,静态DH就是服务器端的DH参数和服务器公钥是固定的,每一次客户端请求连接得到的DH参数和公钥也都是一样的。使用静态DH方式好处是不用每次建立连接时都去重新生成参数,节省了时间,提高了性能,不过致命的缺点就是安全性问题,一旦参数泄露就麻烦了。
动态DH显然就是每次客户端和服务器端建立连接时,都会重新创建DH参数和服务器公钥,即使中间出现密钥泄露,也只是这次通信可能造成信息泄露影响,把损失大大地降低。
消息完整性验证就是用到HMAC消息验证码算法,确保消息是没有经过篡改的,在客户端和服务器端的消息数据发送过程中,先对消息用HMAC算法计算出摘要值,再和原文消息一起发送出去。另一方接收到消息后,先拆分出原始消息,然后对原始消息计算出摘要值,再和一起发来的摘要值作比较,如一致,则证明消息没有被篡改过。
加密层要做的事情就没握手层那么多了,在握手层协商出使用的算法后,加密层功能主要集中在加密和解密部分。
流密码加密就是之前说到的一次性密码本为雏形演变出来的加密模式,在加密前,先计算出消息验证用的摘要值,然后在对原始消息和摘要值一起进行加密。流密码加密模式优点是可以并行计算,效率高,不过缺点是现在已被证实不安全。
分组加密模式就是现在常用的了,将加密数据等分成多个分组数据块,先对原始消息进行加密,然后进行HMAC计算得到摘要值。分组加密优点安全,如CBC分组连接模式,各个分组数据块之间会建立起某种联系(它们的加密密钥和其他分组数据块的加密密钥有关),这样做虽然牺牲了性能,无法并行处理,但提供的安全性更重要。