1.7 可信通信
比特币、以太坊和超级账本在建立网络连接保证节点间可信通信时,都直接采用了传输层安全性(Transport Layer Security,TLS)协议,TLS协议的前身为安全套接字层(Secure Sockets Layer,SSL)协议,SSL协议最初由Netscape公司开发,是一种为网络通信提供安全性及数据完整性的一种安全协议。SSL协议的扩展版本TLS协议自从1999年发布以来已经广泛地应用在浏览器、电子邮件等应用中。并且,TLS协议经过了大规模的验证,已经成为了互联网上保密通信的工业标准,可以说是目前构建区块链网络节点间可信通信的最佳选择。
1.7.1 TLS协议
握手是TLS协议中最精密复杂的部分。在这个过程中,通信双方协商连接参数,并完成身份验证。TLS协议在握手阶段使用混合加密的方式建立安全信道。TLS协议可以通过未加密的信道进行初始密钥交换,一旦建立共享密钥就可以使用对称加密的方式确保通信安全,在这个过程中,每个加密方式、协议版本等都是可选的,均通过双方协商进行。
每一个TLS连接都会从握手开始,在握手过程中,客户端和服务端将会进行四个主要步骤。本节只讨论常见的TLS协议握手过程,即不需要身份验证的客户端与需要身份验证的服务端之间的握手。
下面通过客户端(Client)如何向服务端(Server)建立连接来展示TLS协议的握手过程,整个过程如图1-3所示。
图1-3 TLS协议握手过程
第一步,客户端以明文的形式发出请求消息(client_hello),这条消息将客户端的功能和首选项发送给服务端,其中包含如下内容。
• 客户端生成的随机数random_C。
• 客户端支持的最高TLS协议版本。
• 客户端支持的加密套件(Cipher Suites)。
• 客户端支持的压缩算法列表,默认值是null,代表没有压缩。
• 扩展字段,可能会携带额外的数据。
• 加密套件包括身份验证算法Au、采用的密钥交换算法(用于密钥协商)、对称加密算法和消息摘要算法(校验消息的完整性)。
第二步,服务端收到客户端发来的请求消息以后,返回协商消息(server_hello),server_hello消息的意义在于将选择的连接参数传递回客户端。这条消息的结构与client_hello消息类似,其中包括如下内容。
• 服务端生成的随机数random_S。
• 服务端使用的TLS协议的版本。
• 服务端选择使用的压缩算法版本。
• 服务端选择的加密套件(Cipher Suites)。
• 服务端配置的对应的证书链(可选)。
第三步,客户端收到服务端发来的协商消息以后,会向服务端发送client_key_exchange消息。这条消息的意义在于设置预主密钥,通过传递密钥协商算法所需的参数来允许双方协商出一致的预主密钥。当服务端收到server_hello消息后,首先会检查服务端证书的合法性,如果合法就会进行如下操作。
• 客户端生成预主密钥(Pre-Master)。
• 计算最终对称加密中使用的协商密钥,计算方法为enc_key=Func(random_C, random_S, Pre-Master)。
• 计算之前通信的所有参数的哈希值作为SessionSecret。
• 将SessionSecret和用数字证书携带的公钥加密Pre-Master后发送给服务端。
第四步,服务端收到客户端发来的client_key_exchange消息后,会进行如下操作。
• 用服务端的私钥解密客户端用服务端证书中的公钥加密的Pre-Master的值。
• 基于random_S、random_C和Pre-Master计算双方协商得到的密钥enc_key=Func (random_C, random_S, Pre-Master)。
• 最后与客户端使用同样的方式将双方通信所用参数进行哈希计算,验证得到的SessionSecret是否正确。
至此,整个握手过程全部结束。接下来,客户端与服务端进入加密通信,通信的消息均通过双方协商出来的共享密钥加密。enc_key就是TLS协议传输阶段对称加密所用到的密钥。这里省略了TLS协议很多细节和采用不同加密套件后,一些可选的握手过程,如果想要深入探究TLS协议握手过程可以参考TLS协议1.2版本的规范(RFC 5246)。
1.7.2 双向认证
在上面的整个过程中,都是客户端单向认证服务端的,这是TLS协议常用的场景。同时,服务端可以要求验证客户端,比较常见的场景就是大额网银汇款转账需要在计算机上插入U盾。
U盾中包含银行签发的证书用来验证客户端。双向认证在单向认证第二步的时候,服务端会要求客户端发送证书,来验证客户端证书的有效性。
TLS协议通过上面的四个步骤完成了密钥的协商,其中用到了三个随机数random_C,random_S和Pre-Master,如何通过三个随机数完成密钥交换需要用到密钥协商算法。