数字证书
如果使用对称加密,那么在交换密钥的时候,密钥就可能被窃听,从而使得通信不安全。
中间人攻击使得非对称加密仍然不安全。A 将自己的公钥发送给 B,B 随机生成一个密钥 key 并使用接收到的公钥将其加密后发送给 A,A 再使用私钥解密。由于只有 A 知道私钥,故 key 只有 A 和 B 能知道。
但是中间人攻击可以截获 A 与 B 的通信并实施攻击。A 发送公钥给 B,但是被 C 截获。C 发送自己的公钥给 B,B 误以为是 A 的公钥,随机生成一个密钥 key 并使用接收到的公钥将其加密后发送给 A,此时被 C 继续截获。由于使用的公钥实际上是 C 的,故 C 可以解密得到密钥 key,然后再将 key 用 A 的公钥加密后发送给 A。如此一来,A、B、C 均可知道 key。
我们发现,造成这种攻击的原因是,B 无法确定公钥来自于 A 还是被伪造的。
这个时候就需要我们的数字证书出场了。认证机构 CA 是一个可信的、能够签发数字证书的实体。数字证书由以下几个部分组成:
证书持有者的信息:这部分包括证书持有者的名称、电子邮件地址等身份信息。
公钥:证书中包含了证书持有者的公钥,用于加密和验证数字签名。
证书颁发者的信息:证书中包含了颁发该证书的证书颁发者的信息,包括名称、数字签名等。
证书的有效期:证书中包含了证书的有效期限,指明了该证书的有效使用时间范围。
数字签名:证书中包含了颁发者对证书内容的数字签名,用于验证证书的真实性和完整性。
数字签名是通过加密技术生成的,主要包括以下几个步骤:
创建消息摘要:首先,对要签名的原始数据(比如文件、文本)进行哈希运算,生成一个固定长度的消息摘要。这个消息摘要通常使用安全的哈希算法(如SHA-256)生成。
使用私钥加密:接下来,使用私钥对消息摘要进行加密,形成数字签名。只有拥有对应公钥的人才能解密这个数字签名。
附加到原始数据:将生成的数字签名与原始数据一起传输或存储。接收方可以使用对应的公钥解密数字签名,再对原始数据进行哈希运算,验证消息摘要是否与解密后的数字签名匹配。
数字签名中,私钥用于签名,公钥用于验证。具体而言,A 的个人信息 data 和公钥 public-key 被哈希算法生成了一个摘要 hashstr,CA 使用私钥加密 hashstr 生成一个数字签名。在验证时,我们继续使用 data 和 public-key 生成一个 hashstr2,并将数字签名通过 CA 的公钥来解密生成 hashstr1,如果能够对的上,那么说明信息没有被更改。
传输层安全
传输层安全协议(TLS)是一种在两个通信应用程序之间提供安全通道的协议,通道中的数据传输是加密的,数据的完整性也是被保护的。具有保密性、完整性和身份验证三个属性。
TLS 底层为记录层,定义了 TLS 使用的记录格式;上层为消息层,有握手协议、警报协议、更改密码协议、心跳协议和应用协议。我们主要关注负责建立安全通道的握手协议和用于实际数据传输的应用协议。
TLS 握手协议
- 客户端发送问候(Client Hello)消息。表明支持的密码套件和提供一个 Client Random。
- 服务端发送问候(Server Hello)消息。表明选择的密码套件和提供一个 Server Random。
- 服务端发送公钥证书。
- 服务端发送问候完成(Server Hello Done)消息,表示已经完成握手协商。
- 客户端:发送客户端密钥交换(Client Key Exchange)消息。生成一个随机的预主密钥,然后用服务器的公钥对其加密,并发送给服务器。
- 客户端和服务端:客户端向服务端发送更改密码规范消息,告诉服务端进一步的通信将被加密。服务端同理。
- 客户端和服务器:双方互相发送一个加密的完成消息。
非对称加密比对称加密慢得多,因此,TLS 仅仅使用公钥算法来帮助客户端和服务端生成一个共同的密钥,一旦密钥生成,客户端和服务端将切换到密钥加密算法。
预主密钥 + Client_Random + Server_Random = 主密钥。
密码算法拓展主密钥 ==> 字节序列(两个 MAC 密钥和两个加密密钥),其中加密密钥用于保障机密性,抵御窃听;MAC密钥用于确保完整性,抵御篡改。
TLS 重新协商中的密钥生成。至于要分别生成新的 Client_Random、Server_Random 并发送给对方即可。
TLS 数据传输
要通过 TLS 发送数据,应用程序需要调用 SSL_write() 函数,将数据分块并为每个块生成一个 MAC。
虚拟专用网络 VPN
VPN 允许用户在公网中建立安全、私有的网络。满足用户认证、内容保护、完整性保护等特性。
比较简单的认证方法是通过 IP 地址来认证,那么为了 IP 地址不被修改,我们将 IP 头部和数据一起加密,打包成一个新的数据包,再封装到 IP 数据包中发送,这种方案叫做 IP 隧道。
IPSec 隧道和 TLS/SSL 隧道都可以实现 IP 隧道。其中前者使用了互联网络层安全协议(IPSec),在IPSec 的隧道模式下,整个原始的 IP 数据包被封装在一个新的 IP 数据包内,并且添加了一个新的 IP 头部。这种方案需要在内核的 IP 层实现。
TLS/SSL 隧道在应用层实现,包每个属于 VPN 的 IP 数据包传递给特定的应用程序,然后应用程序将其打包后发送出去。隧道另一端的应用程序提取并解密原始数据包,然后转发到私有网络中。
TLS/SSL VPN 原理概述
VPN 客户端怎么才能将 IP 数据包交给一个应用程序呢?
- 应用程序实现 TUN/TAP 虚拟网络接口,将自己模拟成一台计算机。把数据包发送到 TUN 接口会使得数据包(包括 IP 头部)被传递到用户空间的程序。我们可以使用 TUN 来建立 VPN。TAP 接口运行于数据链路层,可用于创建网桥。
- VPN 客户端配置路由,所有目标地址是 10.0.8.0/24 的数据包发送到 tun 接口。
隧道应用之间使用 TLS 进行加密。