Secure Sockets Layer(SSL) 是网景(Netscape) 在 1995 年提出的一种安全加密协议, 包括 1.0, 2.0 和 3.0 三个版本.
Transport Layer Security(TLS) 是由 IETF 主导的, 对 SSL 的更新. TLS 的初始版本和 SSL 3.0 基本相同. TLS 1.2/1.3 是当前的主流版本, 1.3 相对 1.2 在安全和性能上都有明显的提高.
数据经过加密后(Encrypt), 仅拥有对应密钥的人, 经过解密后可以看到数据的内容. 密钥的形式分为对称密钥和非对称密钥, 非对称密钥下, 常由第三方用公钥对数据进行加密, 随后仅私钥的持有者可以解密对应数据.
摘要(Digest)是指将不定长的数据映射到固定长度, 如 MD5 就会产生 128 比特的字符串. 数据发布者主动公布摘要后, 数据使用者可以按相同规则计算数据的摘要, 通过比对, 校验数据的完整性, 避免使用的数据被篡改.
签名(Sign)是指使用非对称密钥中的私钥计算数据对应签名, 使用者可以使用对应公钥验证数据和签名的关联性, 进而确保数据是由公钥对应方发布或认证的.
基于 RSA 交换密钥的 TLS 握手流程如下, 常见于 TLS 1.2:
客户端确认服务端身份依赖于 Certificate Authority (CA), 即证书颁发机构. 其工作机制可以简单的理解为:
基于 RSA 的密钥交换中, 由客户端生成 pre-master secret 后, 使用服务端的公钥加密后传输给服务端. 理论上, 仅服务端使用严密保护的私钥可以解密这部分数据获取到 pre-master secret. 随后, 客户端和服务端用 pre-master secret, 客户端随机数和服务端随机数生成相同的密钥, 用于后续数据的对称加解密.
TLS 1.3 相较于 TLS 1.2 在安全性和握手效率上都要较大的提高, 具体可以参考 为什么要使用 TLS 1.3 ?.
Server Name Indication (SNI) 是 TLS 的一个扩展, 允许客户端在 ClientHello 中指定想要连接的主机名. SNI 主要用于同一 IP 的服务器承载多个主机名的场景.
诸如 Istio 这样的 Mesh 方案, 会大量使用 SNI 来做路由.
Source: https://github.com/j2gg0s/j2gg0s/blob/main/_posts/2023-11-27-TLS%20%E5%9B%9E%E9%A1%BE.md
1
julyclyde 356 天前
“诸如 Istio 这样的 Mesh 方案, 会大量使用 SNI 来做路由”
这个是怎么个说法? |
2
tool2d 356 天前
我把 TLS hack 了一下,去掉了 SNI ,直接用 ip 访问网站。原本很多被墙的网站,突然就能访问了,有一种莫名的惊喜感。
当然不是所有的网站都能这样操作,一些网站后台还是很依赖 SNI 做路由的。 |
3
GopherDaily OP @julyclyde
1. 本身你就可以基于 SNI 来配置路由规则 2. Istio 的多集群方案中,跨网络&跨集群的请求是由 Ingress 基于 SNI 来做路由的 https://istio.io/latest/docs/setup/install/multicluster/multi-primary_multi-network/ |
4
GopherDaily OP @tool2d 党国的技术可能就是用握手的第一个包来决定是否 ban 的,我们的网站不小心上了反诈后就是 TLS 直接跪,但是 IP&HTTP 可行
|