SSL/TLS可以对通信对象进行认证,并可以确保通信内容的机密性。
SSL/TLS中综合运用了对称密码、消息认证码、公钥密码、数字签名、伪随机数生成器等密码技术。
10.SSL/TLS密码套件使用SSL/TLS进行通信层次化的协议1 TLS记录协议2 TLS握手协议2-1 握手协议2-2 密码规格变更协议2-3 警告协议2-4 应用数据协议主密码主密码的目的小结对SSL/TLS的攻击对各个密码技术的攻击OpenSSL的心脏出血漏洞SSL 3.0的漏洞与POODLE攻击FREAK攻击与密码产品出口管制对伪随机数生成器的攻击利用证书的时间差进行攻击SSL/TLS用户的注意事项不要误解证书的含义密码通信之前的数据是不受保护的密码通信之后的数据是不受保护的
SSL/TLS提供了一种密码通信的框架,其中使用了对称密码、公钥密码、数字签名、单向散列函数等技术,都可以像零件一样进行替换。
但并不是说所有的组件都可以自由选择。实际进行对话的客户端和服务器必须使用相同的密码技术才能进行通信。因此SSL/TLS事先规定了一些密码技术的组合,称为 密码套件 (cipher suite)。
TLS协议由TLS记录协议(TLS record protocol)和 TLS握手协议(TLS handshake protocol)这两层协议叠加而成。
TLS记录协议位于底层,负责进行加密;TLS握手协议位于上层,负责除加密以外的其他各种操作。
上层的TLS握手协议又可以分为4个子协议,如下图所示:
位于TLS握手协议的下层,负责使用对称密码对消息进行加密通信的部分。
TLS记录协议中使用了对称密码和消息认证码,具体算法和共享密钥则是通过握手协议在服务器和客户端之间协商决定的。
TLS记录协议负责消息的压缩、加密以及数据的认证。如下图所示:
首先,消息被分割成多个较短的片段(fragment),然后分别对每个片段进行压缩。压缩算法需要与通信对象协商决定。
接下来,经过压缩的片段会被加上消息认证码,这是为了保证完整性,并进行数据的认证。通过附加消息认证码的MAC值,可以识别出篡改。于此同时,为了防止重放攻击,在计算消息认证码时,还加上了片段的编号。单向散列函数的算法,以及消息认证码所使用的共享密钥都需要与通信对象协商决定。
再接下来,经过压缩的片段再加上消息认证码会一起通过对称密码进行加密。加密使用CBC模式,CBC模式的初始化向量(IV)通过主密码(master secret)生成,而对称密码的算法以及共享密钥需要与通信对象协商决定。
最后,上述经过加密的数据再加上由数据型号、版本号、压缩后的长度组成的报头(header)就是最终的报文数据。其中,数据类型为TLS记录协议所承载的4个子协议之一。
TLS握手协议分为下列4个子协议:握手协议、密码规格变更协议、警告协议、应用数据协议。
握手协议是TSL握手协议的一部分,负责在客户端和服务器之间协商决定密码算法和共享密钥。基于证书的认证操作也在这个协议中完成。它是4个子协议中最复杂的一个。
生成共享密钥是为了进行密码通信,交换证书是为了通信双方互相进行认证。
握手协议中的信息交换是在没有加密的情况下进行的,因此在这一过程中必须使用公钥密码或DH密钥交换。
握手协议的过程如下图所示:
在服务器和客户端之间通过握手协议协商一致后,就会互相发出信号来切换密码。负责发出信号的就是密码规格变更协议。
密码规格变更协议负责向通信对象传达变更密码方式的信号。
即便在密码通信开始后,客户端和服务器也可以通过重新握手来再次改变密码套件。
当协议中途发生错误时,就会通过下面的警告协议传达给对方。
警告协议负责在发生错误时(例如消息认证码错误、压缩数据无法解压缩等)将错误传达给对方。
如果没有错误发生,则会使用下面的应用数据协议进行通信。
负责将TLS上面承载的应用数据传达给通信对象。
主密码是TLS客户端和服务器之间协商出来的一个秘密的数值。TLS密码通信的机密性和数据的认证全部依靠这个数值。
主密码是一个48字节(384比特)的数值。
主密码是客户端和服务器根据下列信息计算出来的:
当使用RSA公钥密码时,客户端会在发送ClientKeyExchange消息时,将经过加密的预备主密码一起发送给服务器。
当使用DH密钥交换时,客户端会在发送ClientKeyExchange消息时,将DH的公开值一起发送给服务器。根据这个值,客户端和服务器会各自生成预备主密码。客户端随机数和服务器随机数的作用相当于防止攻击者事先计算出密钥的 盐 。
当根据预备主密码计算主密码时,需要使用基于密码套件中定义的单向散列函数(如SHA-256)来实现的伪随机数(Pseudo Random Function——PRF)。
主密码用于生成下列6种信息:
TLS握手协议中使用的密码技术:
密码技术 | 作用 |
---|---|
公钥密码 | 加密预备主密码 |
单向散列函数 | 构成伪随机数生成器 |
数字签名 | 验证服务器和客户端的证书 |
伪随机数生成器 | 生成预备主密码 根据主密码生成密钥(密码参数) 生成初始化向量 |
TLS记录协议中使用的密码技术:
密码技术 | 作用 |
---|---|
对称密码(CBC模式) | 确保片段的机密性 |
消息认证码 | 确保片段的完整性并进行认证 |
认证加密(AEAD) | 确保片段的完整性和机密性并进行认证 |
针对SSL/TLS中使用的各个密码技术的攻击,会直接成为对SSL/TLS的攻击。
SSL/TLS作为框架的特性令其不依赖某种特定的密码技术,当发现某种对称密码存在弱点时,今后只要选择不包含该对称密码的密码套件即可。
心脏出血(HeartBleed)并不是SSL/TLS协议本身的漏洞,而是OpenSSL这一实现上的漏洞。
由于OpenSSL在TLS心跳扩展功能中对于请求的数据大小没有进行检查,从而导致误将内存中与该请求无关的信息返回给请求者。攻击者通过访问使用了包含该漏洞的OpenSSL的服务器,就可以在一定范围内窃取服务器上的信息。
SSL 3.0中对CBC模式加密时分组填充操作没有进行严格的规定,而且填充数据的完整性没有受到消息认证码的保护,POODLE攻击利用了这一漏洞窃取秘密信息。POODLW攻击的本质就是CBC模式的填充提示攻击。
更严重的问题是,在某些条件下,攻击者可以将通信协议的版本从TLS强制降级到SSL3.0。
要有效抵御POODLE攻击,必须禁用SSL3.0。
FREAK——Factoring RSA Export Keys:出口级RSA密钥质因数分解。
其攻击方法是强制SSL/TLS服务器使用一种名为RSA Export Suites的强度较低的密码套件。
RSA Export Suites是一种配合当年美国密码产品出口管制的故意弱化的密码套件。它使用了512比特的RSA和40比特的DES,这一组合在当时(1990s)勉强够用,但现时已经绝对不应该使用。
实际上,现在全世界还有很多Web服务器允许使用RSA Export Suites。
FREAK攻击也是一种中间人攻击,当浏览器与Web服务器协商SSL/TLS的密码套件时,攻击者可以介入其中,强制双方使用RSA Export Suites。
网景浏览器的伪随机数生成器的种子都在时间和进程编号等可预测的范围内,因此所得到的密钥范围实际上非常小。
SSL/TLS中,客户端会使用服务器证书对服务器进行认证,此过程中,客户端需要使用合法认证机构的公钥对证书所附带的数字签名进行验证。这需要使用最新版的CRL(证书作废清单)。
如果Web浏览器没有获取最新版的CRL,即便使用SSL/TLS也无法确保通信的安全。
即便对方拥有合法的证书,也不代表你就可以放心地发送信用卡号。
认证机构所进行的本人身份确认也分为不同的等级,需要仔细确认认证机构的业务规则。
SSL/TLS仅对通信过程中的数据进行保护,而无法保护通信前的数据。
SSL/TLS也无法保护通信之后的数据。