V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
httpbin - 协议调试工具
httpstatuses - 协议状态码查询
httpie - cURL-like tool for humans
Fiddler
GopherDaily
V2EX  ›  HTTP

TLS 回顾

  •  
  •   GopherDaily · 2023-11-28 11:10:29 +08:00 · 1032 次点击
    这是一个创建于 393 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 and Sign

    数据经过加密后(Encrypt), 仅拥有对应密钥的人, 经过解密后可以看到数据的内容. 密钥的形式分为对称密钥和非对称密钥, 非对称密钥下, 常由第三方用公钥对数据进行加密, 随后仅私钥的持有者可以解密对应数据.

    摘要(Digest)是指将不定长的数据映射到固定长度, 如 MD5 就会产生 128 比特的字符串. 数据发布者主动公布摘要后, 数据使用者可以按相同规则计算数据的摘要, 通过比对, 校验数据的完整性, 避免使用的数据被篡改.

    签名(Sign)是指使用非对称密钥中的私钥计算数据对应签名, 使用者可以使用对应公钥验证数据和签名的关联性, 进而确保数据是由公钥对应方发布或认证的.

    TLS 1.2

    基于 RSA 交换密钥的 TLS 握手流程如下, 常见于 TLS 1.2:

    • 客户端连接到服务端的端口, 并发送 ClientHello, 主要包括: 支持的 TLS 版本, 支持的加密套件(cipher suite) 和 32 个字节的客户端随机数.
    • 服务根据收到的信息, 返回 ServerHello, 主要包括: 选择的 TLS 版本, 选择的加密套件和 32 个字节的服务端随机数; 以及服务端的 TLS 证书.
    • 客户端基于预先配置的可信 CA, 校验 TLS 证书中的主机名和预期相符.
    • 客户端生成 pre-master secret, 用收到证书中的公钥加密后发送给服务端, 即 ClientKeyExchange.
    • 服务端用私钥解密 ClientKeyExchange, 获的 pre-master secret, 配合前文的客户端随机数, 服务端随机数生成会话密钥.
    • 客户端使用 pre-master secret, 客户端随机数, 服务端随机数生成会话密钥.
    • 服务端用会话密钥加密本次握手的数据, 发送给客户端供其确认会话密钥.
    • 客户端用会话密钥加密本次我所的数据, 发送给服务端供其确认会话密钥.

    客户端确认服务端身份依赖于 Certificate Authority (CA), 即证书颁发机构. 其工作机制可以简单的理解为:

    • 存在一些总所周知的证书颁发机构, 如 DigiCert, Let's Encrypt.
    • 服务端提供主机名向这些 CA 申请公私钥证书, 公钥证书中含有服务端对应主机名, 并由 CA 的私钥签名.
    • 操作系统预先内置了这些 CA 的公钥证书, 客户端在和服务端建立链接时使用预置的 CA 的公钥来验证服务端的证书是可信.

    基于 RSA 的密钥交换中, 由客户端生成 pre-master secret 后, 使用服务端的公钥加密后传输给服务端. 理论上, 仅服务端使用严密保护的私钥可以解密这部分数据获取到 pre-master secret. 随后, 客户端和服务端用 pre-master secret, 客户端随机数和服务端随机数生成相同的密钥, 用于后续数据的对称加解密.

    TLS 1.3 相较于 TLS 1.2 在安全性和握手效率上都要较大的提高, 具体可以参考 为什么要使用 TLS 1.3 ?.

    SNI

    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

    4 条回复    2023-11-28 11:38:04 +08:00
    julyclyde
        1
    julyclyde  
       2023-11-28 11:23:04 +08:00
    “诸如 Istio 这样的 Mesh 方案, 会大量使用 SNI 来做路由”
    这个是怎么个说法?
    tool2d
        2
    tool2d  
       2023-11-28 11:25:30 +08:00
    我把 TLS hack 了一下,去掉了 SNI ,直接用 ip 访问网站。原本很多被墙的网站,突然就能访问了,有一种莫名的惊喜感。

    当然不是所有的网站都能这样操作,一些网站后台还是很依赖 SNI 做路由的。
    GopherDaily
        3
    GopherDaily  
    OP
       2023-11-28 11:36:18 +08:00   ❤️ 1
    @julyclyde
    1. 本身你就可以基于 SNI 来配置路由规则
    2. Istio 的多集群方案中,跨网络&跨集群的请求是由 Ingress 基于 SNI 来做路由的 https://istio.io/latest/docs/setup/install/multicluster/multi-primary_multi-network/
    GopherDaily
        4
    GopherDaily  
    OP
       2023-11-28 11:38:04 +08:00
    @tool2d 党国的技术可能就是用握手的第一个包来决定是否 ban 的,我们的网站不小心上了反诈后就是 TLS 直接跪,但是 IP&HTTP 可行
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1053 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:37 · PVG 03:37 · LAX 11:37 · JFK 14:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.