查看源代码 TLS/DTLS 协议概述
目的
传输层安全 (TLS) 及其前身安全套接字层 (SSL) 是旨在为计算机网络提供通信安全的加密协议。这些协议使用 X.509 证书和公钥(非对称)密码术来验证与之通信的对方,并交换用于有效负载加密的对称密钥。该协议提供数据/消息机密性(加密)、完整性(通过消息身份验证码检查)和主机验证(通过证书路径验证)。DTLS(数据报传输层安全)基于 TLS,但面向数据报而不是面向流。
Erlang 支持
Erlang SSL 应用程序实现了当前支持的 TLS/DTLS 协议版本,请参阅 ssl
手册页。
默认情况下,TLS 通过 TCP/IP 协议运行,即使您可以使用与 Kernel 中的 gen_tcp
模块具有相同应用程序编程接口 (API) 的任何其他可靠传输协议。DTLS 默认通过 UDP/IP 运行,这意味着应用程序数据没有交付保证。未来的版本可能会支持其他传输,例如 SCTP。
如果客户端和服务器想要使用升级机制(例如 RFC 2817 定义的机制)将常规 TCP/IP 连接升级到 TLS 连接,则 Erlang SSL 应用程序 API 支持此功能。这对于例如在同一端口上支持 HTTP 和 HTTPS 以及实现虚拟主机非常有用。请注意,这仅是 TLS 的一项功能。
安全概述
为了实现身份验证和隐私,客户端和服务器在传输或接收任何数据之前会执行 TLS/DTLS 握手过程。在握手期间,它们就协议版本和加密算法达成一致,使用公钥密码术生成共享密钥,并可以选择使用数字证书相互验证。
数据隐私和完整性
对称密钥算法只有一个密钥。该密钥既用于加密也用于解密。与公钥算法(使用两个密钥,一个公钥和一个私钥)相比,这些算法速度很快,因此通常用于加密批量数据。
对称加密的密钥是为每个连接唯一生成的,并且基于 TLS/DTLS 握手中协商的密钥。
TLS/DTLS 握手协议和数据传输在 TLS/DTLS 记录协议之上运行,该协议使用键控哈希消息身份验证码 (MAC) 或基于哈希的 MAC (HMAC) 来保护消息数据的完整性。来自 TLS RFC:“消息身份验证码是从消息和一些秘密数据计算出的一种单向哈希值。在不知道秘密数据的情况下,很难伪造它。其目的是检测消息是否被篡改。”
数字证书
证书类似于驾驶执照或护照。证书的持有者称为主体。该证书使用证书颁发者的私钥签名。信任链的建立方式是,颁发者又由另一个证书认证,依此类推,直到您到达所谓的根证书,该证书是自签名的,即由其自身颁发。
证书仅由证书颁发机构 (CA) 颁发。世界上少数顶级的 CA 颁发根证书。您可以通过点击 Web 浏览器的菜单来检查其中的几个证书。
对等身份验证
对等身份验证通过 RFC 3280 中定义的公钥路径验证来完成。这基本上意味着以下内容:
- 证书链中的每个证书都由前一个证书颁发。
- 证书属性有效。
- 根证书是存在于对等端维护的受信任证书数据库中的受信任证书。
服务器始终在 TLS 握手过程中发送证书链,但客户端仅在服务器请求时发送证书链。如果客户端没有适当的证书,它可以向服务器发送“空”证书。
客户端可以选择接受一些路径评估错误,例如,Web 浏览器可以询问用户是否接受未知的 CA 根证书。但是,服务器如果请求证书,则不接受任何路径验证错误。如果服务器要接受或拒绝作为证书请求响应的“空”证书,则是可配置的。
TLS 会话 - TLS-1.3 之前
来自 TLS RFC:“TLS 会话是客户端和服务器之间的关联。会话由握手协议创建。会话定义了一组加密安全参数,这些参数可以在多个连接之间共享。会话用于避免为每个连接进行昂贵的新安全参数协商。”
默认情况下,会话数据由 SSL 应用程序保存在内存存储中,因此会话数据在应用程序重新启动或接管时会丢失。如果需要持久数据存储,用户可以定义自己的回调模块来处理会话数据存储。当会话数据库超出其限制或在保存 24 小时后(RFC 最大生存期建议)时,会话数据也会失效。可以配置会话数据的保存时间。
默认情况下,TLS/DTLS 客户端尝试重用可用的会话,并且默认情况下,当客户端请求时,TLS/DTLS 服务器同意重用会话。另请参阅 TLS-1.3 之前的会话重用
TLS-1.3 会话票证
在 TLS 1.3 中,会话重用被基于先前共享密钥概念的新会话票证机制所取代。此机制也废弃了此应用程序未实现的 RFC5077 中的会话票证。另请参阅 TLS-1.3 中的会话票证和会话恢复