HTTPS DNS 详解

发布于:2025-07-17 ⋅ 阅读:(21) ⋅ 点赞:(0)

DNS

  • 解决记忆问题: IP 地址(IPv4 如 192.0.2.1, IPv6 如 2001:db8::1) 难以记忆和书写。

  • 提供抽象层: 域名(如 company.com)更具描述性和稳定性。即使服务器背后的 IP 地址发生变化(服务器迁移、负载均衡、故障转移),用户仍然可以使用相同的域名访问服务。

  • 支持服务分发: 一个域名可以映射到多个 IP 地址(如大型网站的多个服务器),实现负载均衡和高可用性。

一. DNS 的核心组件

  • 域名空间 (Domain Name Space):

    • 一个巨大的、分布式的、层次化的树状结构数据库。

    • 根域 (Root Domain): 树的最顶端,用单个点 . 表示(通常省略)。由 根域名服务器 管理。

    • 顶级域 (Top-Level Domains - TLDs): 根域下的第一层分支。常见的有:

      • 通用顶级域 (gTLDs):.com.org.net.edu.gov.info.io 等。

      • 国家代码顶级域 (ccTLDs):.cn (中国), .us (美国), .uk (英国), .jp (日本) 等。

      • 新增 gTLDs:.app.blog.cloud 等。

    • 二级域 (Second-Level Domains): 用户在 TLD 下注册的独特名称 (如 baidu 在 .com 下形成 baidu.com)。

    • 子域 (Subdomains): 二级域下的进一步划分 (如 www.baidu.commail.baidu.comsupport.baidu.com)。

    • 主机名 (Hostname): 标识特定计算机或资源的名称(如 www)。完全限定域名 (FQDN) 包含主机名和所有父域(如 www.baidu.com.,最后的点表示根域,通常省略)。

  • 域名服务器 (Name Servers):

    • 存储特定域名空间分区(称为 区域)信息的服务器。

    • 类型:

      • 根域名服务器: 全球只有 13 组(逻辑组,实际有数百台物理镜像服务器)。它们知道所有 TLD 的权威域名服务器的地址。

      • TLD 域名服务器: 负责管理特定顶级域(如 .com.cn)。它们知道该 TLD 下注册的二级域的权威域名服务器的地址。

      • 权威域名服务器: 存储特定域(如 baidu.com)及其子域的 真实、最终 DNS 记录(如 A, AAAA, MX, CNAME 等)。域名所有者或托管商负责配置这些服务器。一个域通常有多个权威服务器(主 + 从)以提高可靠性。

      • 递归解析器 (Recursive Resolver): 也称为 DNS 解析器。这是客户端(如你的电脑、手机)直接打交道的服务器(通常由你的 ISP、公共 DNS 如 8.8.8.8 / 114.114.114.114、或本地路由器提供)。它不存储特定域的权威信息,而是代表客户端执行完整的 DNS 查询流程,直到找到答案或返回错误。它会缓存结果以提高效率。

  • DNS 记录 (Resource Records - RRs): 存储在权威域名服务器上的实际数据条目。每个记录包含特定类型的信息。常见类型:

    • A (Address) 记录: 将域名映射到 IPv4 地址 (e.g., www.baidu.com -> 220.181.38.150)。

    • AAAA (Quad-A) 记录: 将域名映射到 IPv6 地址 (e.g., www.example.com -> 2001:db8::1)。

    • CNAME (Canonical Name) 记录: 为一个域名设置别名。指向另一个域名,由该域名最终解析 IP (e.g., blog.company.com CNAME to company-blog.hosting.com)。常用于 CDN 或简化配置。

    • MX (Mail Exchange) 记录: 指定接收该域名电子邮件的邮件服务器地址 (e.g., company.com MX priority:10 mailserver.company.com)。通常指向 A 或 AAAA 记录。

    • NS (Name Server) 记录: 指定负责该域或子域的权威域名服务器的主机名 (e.g., company.com NS ns1.dnshosting.com)。告诉解析器去哪里查询该域的其他记录。

    • PTR (Pointer) 记录: 用于 反向 DNS 查询,将 IP 地址映射回域名 (e.g., 150.38.181.220.in-addr.arpa -> www.baidu.com)。

    • TXT (Text) 记录: 存储任意文本信息。常用于域名所有权验证(如 Google Search Console)、发送方策略框架 (SPF) 反垃圾邮件、DKIM 邮件签名等。

    • SOA (Start of Authority) 记录: 存储关于该区域(zone)的重要管理信息,如主权威服务器、管理员邮箱、序列号(用于同步)、刷新/重试/过期时间、最小 TTL 等。每个区域有且仅有一个 SOA 记录。

    • SRV (Service) 记录: 指定提供特定服务(如 VoIP, XMPP, LDAP)的服务器地址和端口号。

    • CAA (Certification Authority Authorization) 记录: 指定哪些证书颁发机构 (CA) 可以为该域名颁发 SSL/TLS 证书,增强安全性。

  • DNS 客户端 (Resolver Stub / Client): 操作系统或应用程序内置的简单 DNS 解析功能。它负责向配置好的递归解析器发送查询请求并接收响应。

二. DNS 查询工作原理 (重点)

DNS 查询是一个典型的 递归与迭代查询结合 的过程。以用户访问 www.example.com 为例:

  1. 本地查找:

    • 用户在浏览器输入 www.example.com

    • 操作系统(DNS Stub Resolver)首先检查本地缓存(浏览器缓存、操作系统缓存、hosts 文件)是否有 www.example.com 的 IP 记录。如果有且未过期,直接使用,查询结束。

    • 如果没有,Stub Resolver 向配置的递归解析器(如 8.8.8.8)发送一个 递归查询 请求:“请给我 www.example.com 的 IP 地址,不管花多少步,请给我最终答案或错误”。

  2. 递归解析器的工作 (递归+迭代):

    • 递归解析器收到请求后,首先检查自己的缓存。如果有有效记录,直接返回给客户端,查询结束。

    • 如果没有缓存或缓存过期:

      • a. 查询根域名服务器: 递归解析器向其中一个根域名服务器发送一个 迭代查询 请求:“请问 .com TLD 的权威域名服务器地址是什么?” 根服务器返回 .com TLD 的 NS 记录列表(以及对应的 A/AAAA 记录,称为 Glue Records)。

      • b. 查询 TLD 域名服务器: 递归解析器选择一个 .com TLD 服务器,发送迭代查询:“请问 example.com 域的权威域名服务器地址是什么?” TLD 服务器返回 example.com 的 NS 记录列表(及对应的 Glue Records)。

      • c. 查询权威域名服务器: 递归解析器选择一个 example.com 的权威服务器,发送迭代查询:“请问 www.example.com 的 A 记录(或 AAAA 记录)是什么?” 权威服务器查找自己的区域文件,找到 www.example.com 的记录:

        • 如果 www 是 A/AAAA 记录,直接返回 IP 地址。

        • 如果 www 是 CNAME 记录(如 www.example.com CNAME webserver.example.com),则递归解析器需要重新开始查询 webserver.example.com 的 A/AAAA 记录(重复上述 a-c 步骤,但查询对象变为 webserver.example.com)。

      • d. 返回结果: 递归解析器最终获得 www.example.com(或其 CNAME 目标)的 IP 地址。

    • 递归解析器将最终得到的 IP 地址返回给客户端(Stub Resolver)。

    • 递归解析器缓存沿途获得的所有记录(根提示、TLD NS、权威 NS、最终 A/AAAA 等),并根据记录的 TTL (Time-To-Live) 值决定缓存时间。

  3. 客户端连接:

    • 客户端操作系统收到 www.example.com 的 IP 地址。

    • 操作系统(或浏览器)将该 IP 地址放入本地缓存。

    • 浏览器使用该 IP 地址与目标服务器建立 TCP 连接(通常是 HTTP/HTTPS 端口 80/443),开始传输网页内容。

三. 重要概念与技术

  • DNS 缓存: 各级服务器(递归解析器、操作系统、浏览器)和客户端都会缓存 DNS 记录,以减少查询次数、降低延迟、减轻服务器负载。记录的 TTL 值(秒)定义了该记录在非权威服务器上可以被缓存多久。

  • DNS 区域传输: 主权威服务器和从权威服务器之间同步区域文件数据的过程(AXFR 或增量 IXFR)。

  • DNSSEC (DNS Security Extensions): 一套为 DNS 提供数据来源验证、数据完整性校验和否定存在验证的安全扩展协议。通过数字签名防止 DNS 欺骗和缓存污染攻击。部署仍在逐步推进中。

  • 动态 DNS: 允许客户端(如家庭路由器)在 IP 地址发生变化时自动更新其 DNS 记录(通常指向一个固定的域名)。

  • Anycast DNS: 一种网络寻址和路由方法,多个地理分散的 DNS 服务器共享同一个 IP 地址。路由器将查询引导到“最近”(网络拓扑上)的服务器,提高解析速度和冗余性。广泛应用于根服务器、TLD 服务器和大型公共 DNS(如 Google DNS, Cloudflare DNS)。

  • DNS 负载均衡: 通过为一个域名配置多个 A/AAAA 记录(返回多个 IP 地址),DNS 本身可以实现简单的轮询(Round Robin)负载均衡。更复杂的负载均衡通常在应用层或使用专用设备(如 GSLB)实现。

  • CDN 与 DNS: CDN 提供商利用 DNS 将用户请求智能地路由到离用户最近或性能最优的边缘服务器节点(通常通过 CNAME 将客户域名指向 CDN 的域名)。

四. 常见 DNS 问题

  • DNS 解析失败: 域名不存在(NXDOMAIN)、权威服务器故障、递归解析器故障/配置错误、网络问题。

  • DNS 污染/劫持: 中间节点(恶意路由器、ISP、恶意软件)篡改 DNS 响应,将用户引导到错误的 IP 地址(常用于钓鱼或审查)。

  • DNS 缓存中毒: 攻击者伪造权威服务器的响应,将错误记录注入递归解析器的缓存中。

  • DDoS 攻击: 针对 DNS 基础设施(尤其是根服务器或大型递归解析器)发动大规模流量攻击,使其瘫痪。

  • 配置错误: 错误的 DNS 记录(如拼写错误、指向无效 IP)、未更新的记录(迁移后忘记改 DNS)、NS 记录或 Glue Record 缺失/错误导致权威服务器不可达。

总结

DNS 是一个庞大、复杂且至关重要的分布式系统。它不仅仅是简单的域名到 IP 的转换,还支撑着电子邮件的投递(MX 记录)、网络服务发现(SRV 记录)、安全验证(TXT, CAA)、负载均衡、CDN 以及互联网整体的可靠性和可扩展性。理解 DNS 的基本概念、工作原理和记录类型对于网络管理、网站运维、应用开发和网络安全都至关重要。它就像隐藏在互联网幕后的精密齿轮,默默地确保着用户能够通过简单易记的名字访问到世界各地的资源。
 

RSA

一、核心概念与数学基础

1. 非对称加密

  • 公钥 (Public Key): 公开给所有人,用于加密验证签名

  • 私钥 (Private Key): 严格保密,用于解密生成签名

  • 核心特性: 用公钥加密的信息只能用对应的私钥解密;用私钥签名的信息能用对应的公钥验证。

2. 关键数学定理

  1. 欧拉函数 φ(n):

    • 定义:小于正整数 n 且与 n 互质的正整数的个数。

    • 若 n = p * q (p, q 为质数),则 φ(n) = (p-1)*(q-1)。这是 RSA 的核心公式。

  2. 欧拉定理:

    • 若正整数 a 与 n 互质(即 gcd(a, n) = 1),则 a^φ(n) ≡ 1 (mod n)

  3. 模反元素(乘法逆元):

    • 若整数 e 与整数 d 满足 e * d ≡ 1 (mod φ(n)),则称 d 是 e 关于模 φ(n) 的模反元素。


二、RSA 密钥生成步骤

  1. 选择两个大质数:

    • 随机选择两个非常大大小相近的质数 p 和 q

    • 安全性要求: p 和 q 必须足够大(通常为 1024 位或 2048 位以上),使得分解 n = p * q 在计算上不可行。

  2. 计算模数 n:

    • 计算 n = p * q

    • n 的长度(比特数)就是 RSA 的密钥长度(如 2048 位)。

  3. 计算欧拉函数 φ(n):

    • 计算 φ(n) = (p - 1) * (q - 1)

  4. 选择公钥指数 e:

    • 选择一个整数 e,满足 1 < e < φ(n) 且 e 与 φ(n) 互质(即 gcd(e, φ(n)) = 1)。

    • 常用 e = 65537 (0x10001)

      • 它是质数。

      • 二进制表示中只有两个 1,计算速度快(平方-乘算法效率高)。

      • 足够大,安全性较好。

  5. 计算私钥指数 d:

    • 计算 e 关于模 φ(n) 的模反元素 d。即求解满足 e * d ≡ 1 (mod φ(n)) 的 d

    • 公式: d = e^(-1) mod φ(n)

    • 通常使用扩展欧几里得算法 (Extended Euclidean Algorithm) 高效计算 d

  6. 得到密钥对:

    • 公钥 (Public Key): (e, n)

    • 私钥 (Private Key): (d, n)

    • pqφ(n) 必须严格保密或安全销毁。


三、RSA 加密与解密过程

1. 加密(使用公钥)

  • 目标: 将明文 M 加密为密文 C

  • 输入: 明文 M(一个整数),满足 0 ≤ M < n

    • 实际应用中,原始数据(如文本)需要先通过 PKCS#1 OAEP 等填充方案转换为符合要求的整数 M

  • 计算: C = M^e mod n

  • 输出: 密文 C

2. 解密(使用私钥)

  • 目标: 将密文 C 解密为明文 M

  • 输入: 密文 C

  • 计算: M = C^d mod n

  • 输出: 明文 M

3. 数学证明(为什么解密正确?)

根据加密: C ≡ M^e (mod n)
代入解密: C^d ≡ (M^e)^d ≡ M^(e*d) (mod n)

由密钥生成可知: e * d ≡ 1 (mod φ(n)), 即存在整数 k 使得: e * d = 1 + k * φ(n)

因此: M^(e*d) ≡ M^(1 + k*φ(n)) ≡ M * (M^φ(n))^k (mod n)

根据欧拉定理:

  • 如果 M 与 n 互质 (gcd(M, n) = 1):则 M^φ(n) ≡ 1 (mod n),所以 M^(e*d) ≡ M * (1)^k ≡ M (mod n)

  • 如果 M 与 n 不互质:由于 n = p * q,且 M < n,则 M 必是 p 或 q 的倍数(但不能同时是两者的倍数,否则 M >= n)。假设 M = h * ph 与 q 互质)。此时:

    • 根据费马小定理:M^(q-1) ≡ 1 (mod q) => M^(k*φ(n)) = M^(k*(p-1)(q-1)) ≡ 1 (mod q)

    • 所以 M^(e*d) = M^(1 + k*φ(n)) ≡ M * 1 ≡ M (mod q)

    • 同时显然有 M^(e*d) ≡ M ≡ 0 (mod p)(因为 M 是 p 的倍数)

    • 根据中国剩余定理 (CRT),满足 x ≡ M (mod p) 和 x ≡ M (mod q) 的唯一解在模 n 下就是 x ≡ M (mod n)

  • 综上,无论在何种情况下,M^(e*d) ≡ M (mod n) 成立。


四、RSA 数字签名与验证

RSA 也可用于证明消息来源和完整性。

1. 签名生成(使用私钥)

  • 目标: 对消息 M 生成签名 S

  • 输入: 消息 M(实际中先对 M 做 Hash 得到摘要 H(M),再用私钥对摘要签名)。

  • 计算签名: S = [H(M)]^d mod n (或直接 S = M^d mod n,但强烈不推荐,需先 Hash)

  • 输出: 签名 S

2. 签名验证(使用公钥)

  • 目标: 验证签名 S 是否是对消息 M 的有效签名。

  • 输入: 消息 M,签名 S,公钥 (e, n)

  • 计算:

    1. 对收到的消息 M 用相同的 Hash 算法计算摘要 H'(M)

    2. 用公钥解密签名: H = S^e mod n (得到声称的原始摘要)。

  • 验证: 比较 H'(M) == H

    • 如果相等:签名有效(证明消息由私钥持有者签发,且未被篡改)。

    • 如果不相等:签名无效(消息被篡改或签名非私钥持有者生成)。

为什么先 Hash?

  1. 安全性: 直接对原始消息 M 签名存在安全风险(如可被选择明文攻击、可被用于伪造其他消息签名)。

  2. 效率: Hash 将任意长消息压缩成固定短摘要,签名速度快。

  3. 标准化: PKCS#1, PSS 等标准都规定对摘要签名。常用 Hash 算法: SHA-256, SHA-384。


五、RSA 的实际应用与填充方案

直接使用 C = M^e mod n 进行加密(称为教科书式 RSA 或 裸 RSA)存在严重安全问题:

  1. 确定性: 相同明文总是产生相同密文,易受选择明文攻击

  2. 可延展性: 攻击者可能构造特殊密文,解密后得到有意义的信息。

  3. 小明文攻击: 如果 M^e < n,则 C = M^e(没有模运算),攻击者直接开 e 次方即可解密。

解决方案:使用填充 (Padding) 方案。在加密/签名前,对明文/摘要进行特定格式的填充。

常用填充方案

  1. PKCS#1 v1.5 (加密):

    • 在明文 M 前添加随机填充字节:0x00 + 0x02 + 至少8字节非0随机数 + 0x00 + M

    • 解密后需验证填充格式是否正确。曾存在 Bleichenbacher 攻击 (CCA),需谨慎实现。

  2. OAEP (Optimal Asymmetric Encryption Padding):

    • 更安全的加密填充方案,使用随机种子和 Hash 函数(如 SHA-256)进行两次混合。

    • 能抵抗选择密文攻击 (CCA),是 推荐方案

  3. PSS (Probabilistic Signature Scheme):

    • 用于签名的安全填充方案,同样引入随机盐值。

    • 安全性可证明,是 推荐的签名方案


六、RSA 的性能与优化

  • 计算慢: 大数模幂运算 (M^e mod nC^d mod n) 计算开销大,尤其密钥长度大时。

  • 优化方法:

    1. 选择合适的小公钥 e 如 e=65537,其二进制形式 10000000000000001 只有两个 1,使用平方-乘算法时计算非常高效。

    2. 中国剩余定理 (CRT):

      • 私钥持有者额外保存 pqd_p = d mod (p-1)d_q = d mod (q-1)q_inv = q^(-1) mod p

      • 解密/签名时计算:

        • m_p = C^(d_p) mod p

        • m_q = C^(d_q) mod q

        • h = (q_inv * (m_p - m_q)) mod p

        • M = m_q + h * q

      • 速度提升 4 倍以上,是标准优化。但需保护 pq 等中间值不被侧信道攻击获取。

    3. 硬件加速: 使用支持大数运算的专用硬件(如密码协处理器)。


七、RSA 的安全性考量

  1. 基础困难问题: 安全性依赖于 大整数 n = p * q 的质因数分解困难性。目前没有多项式时间算法能分解大整数。

  2. 密钥长度:

    • 1024 位: 已不安全,被破解过(如 2010 年利用数域筛分解了 768 位 RSA)。不应再使用

    • 2048 位: 当前主流推荐安全长度(有效期至 ~2030 年)。

    • 3072/4096 位: 长期安全或更高安全需求。

  3. 侧信道攻击 (Side-Channel Attacks):

    • 通过测量时间、功耗、电磁辐射等物理信息推断密钥(尤其是私钥 d)。

    • 防护: 恒定时间实现、盲签名 (Blinding)。

  4. 实现攻击:

    • 填充预言攻击 (Bleichenbacher): 针对 PKCS#1 v1.5 填充。

    • 计时攻击 (Timing Attack): 针对平方-乘算法的分支。

  5. 量子计算威胁:

    • Shor 算法能在多项式时间内分解大整数,彻底破解 RSA

    • 虽然大规模实用量子计算机尚未出现,但研究 后量子密码学 (PQC) 是当务之急。NIST 正在标准化 PQC 算法(如 CRYSTALS-Kyber, CRYSTALS-Dilithium)。


八、总结

  • 核心原理: 基于大数分解困难性的非对称加密/签名算法。

  • 密钥对: 公钥 (e, n) 公开,私钥 (d, n) 保密。

  • 操作:

    • 加密: C = M^e mod n (明文 M 需先填充)

    • 解密: M = C^d mod n

    • 签名: S = [H(M)]^d mod n (先 Hash)

    • 验证: H ?= S^e mod n (比较 Hash)

  • 关键点:

    • 必须使用安全填充 (OAEP/PSS)!

    • 密钥长度至少 2048 位。

    • 优化使用 CRT 和合适的小 e (65537)。

    • 警惕侧信道和实现漏洞。

  • 应用: TLS/SSL 握手 (加密预备主密钥)、数字证书签名、SSH 登录、PGP/GPG 加密邮件、软件签名、区块链等。

RSA 作为公钥密码学的基石,深刻改变了信息安全格局。理解其原理、安全使用方法和潜在威胁,对于构建和评估安全系统至关重要。随着计算能力的提升和量子计算的发展,持续关注密钥长度建议和后量子密码迁移是必要的。


网站公告

今日签到

点亮在社区的每一天
去签到