HTTPS 到底加密了什么?从明文到密文的完整原理详解

地址栏那把小锁,你每天看几十次。但 HTTPS 到底做了什么、凭什么"安全",大多数人说不清楚。这篇文章不堆术语,从"为什么 HTTP 不安全"出发,一步步推导出 HTTPS 的完整设计 —— 你会发现,它的每一个环节都是被某个具体问题逼出来的,逻辑非常顺。看完之后,再看到那把小锁,你脑子里能浮现出一整套机制,那才是真的"看懂了"HTTPS。

先搞清楚:HTTP 到底差在哪

HTTP 是明文传输。你的数据从浏览器出发,要经过家里的路由器、运营商的网络、一级级骨干网,最后才到服务器机房。这一路上经过的每一个节点,理论上都能看到、甚至改掉你的数据包。

你的电脑 ──────────────────────────────────────►  服务器
  数据包要经过:家里路由器 → 运营商 → 各级骨干网 → 机房交换机
  这一路上每一个节点,理论上都能【看到】甚至【改掉】你的数据

明文 HTTP 带来三个致命问题:窃听 —— 你输入的密码、银行卡号,中间任何一个节点都能直接读到;篡改 —— 运营商可以往页面里插广告,攻击者可以把你下载的安装包换成病毒,你完全察觉不到;冒充 —— 你以为连的是银行网站,其实连的是一个长得一模一样的钓鱼站。

HTTPS 要解决的,就是这三件事:不被偷看(机密性)、不被改(完整性)、确认对方真的是它(身份认证)。下面一步步看它怎么做到。

第一步:对称加密,以及它的死结

要"不被偷看",自然想到加密。最直接的是对称加密 —— 加密和解密用同一把钥匙。

对称加密:加密和解密用「同一把钥匙」
  明文 ──[钥匙K 加密]──► 密文 ──[钥匙K 解密]──► 明文
  又快又强,但死结是:这把钥匙 K 怎么安全地交给对方?
  传输通道本身就不安全,你明文发钥匙 = 等于没加密

对称加密本身又快又安全,问题出在钥匙怎么送达:你和服务器素未谋面,你要把这把钥匙交给它,但传输通道本身就是不安全的 —— 如果你把钥匙明文发过去,中间人顺手就抄走了,加密形同虚设。这就是对称加密的死结:它能保护数据,却保护不了钥匙本身。

第二步:非对称加密,巧妙但慢

非对称加密换了个思路:不是一把钥匙,而是一对 —— 公钥和私钥。

非对称加密:一对钥匙,公钥(public)+ 私钥(private)
  ┌──────────────────────────────────────────┐
  │ 公钥加密的,只有对应的私钥能解            │
  │ 私钥加密(签名)的,能用对应的公钥验证    │
  └──────────────────────────────────────────┘
  公钥可以随便公开,私钥自己死守。
  缺点:运算慢,不适合加密大量数据

这个设计很妙:公钥可以大大方方公开给任何人,私钥自己死死守住。别人想给你发秘密,就用你的公钥加密,而全世界只有你的私钥能解开。钥匙分发的难题,似乎一下子解决了 —— 公钥根本不怕被人看到。但非对称加密有个硬伤:运算慢,比对称加密慢上几个数量级,用它来加密整个网页、整个视频流,性能上扛不住。

真正的方案:两种加密结合

既然对称加密"快但钥匙难传",非对称加密"能安全传钥匙但慢",那就让它们各做各擅长的事:

HTTPS 的真实做法 —— 两种加密各取所长:
  1. 先用「非对称加密」,安全地协商出一把「对称会话密钥」
  2. 之后所有的应用数据传输,都用这把对称密钥加密(快)
  非对称加密只用在「开头交换钥匙」这一下

这就是 HTTPS 的核心思路:非对称加密只用在开头"交换钥匙"这一下,真正的数据传输全程走对称加密。既解决了钥匙分发,又保住了性能。到这里,"不被偷看"基本解决了。

但还有个大问题:你怎么知道公钥是真的

上面的方案有个隐藏漏洞。你要用"服务器的公钥"来加密,但这个公钥是通过不安全的网络发给你的 —— 万一在路上被中间人换成了他自己的公钥呢?那你以为在和服务器建立加密通道,其实是在和攻击者建立。这就是中间人攻击

问题的本质在于:加密解决了"不被偷看",但没解决"对方到底是不是它"。你需要一个办法,确认手里这个公钥真的属于这个网站,而不是别人冒充的。

数字证书与 CA:信任是怎么建立的

解决办法是引入一个"权威第三方" —— CA(Certificate Authority,证书颁发机构)。逻辑是这样的:网站把自己的公钥和域名等信息交给 CA;CA 核实之后,用 CA 自己的私钥给这份信息签个名,打包成一张数字证书。以后服务器不再直接发"裸公钥",而是发这张证书。

你拿到证书后怎么验?用 CA 的公钥去验证那个签名 —— 签名对得上,就说明这张证书确实是 CA 签发的、没被改过。那 CA 的公钥又从哪来?答案是:操作系统和浏览器里,预装了一批被全世界公认的根 CA 证书。这是整个信任体系的起点。

证书信任链:
  根 CA 证书(操作系统 / 浏览器里预装,作为「信任的起点」)
        │ 签发
        ▼
  中间 CA 证书
        │ 签发
        ▼
  网站证书(blog.biekanle.com,里面含网站的公钥)

  浏览器拿到网站证书后,顺着这条链一路往上验签,
  只要最终能验到「我预装信任的某个根 CA」,就认这张证书有效

中间人没有 CA 的私钥,伪造不出能通过验证的证书 —— 冒充的问题就此解决。

把流程串起来:一次完整的 TLS 握手

HTTPS = HTTP + TLS。前面所有的设计,都发生在 TLS 握手这个阶段:

TLS 握手(简化):
  客户端                                     服务器
    │ 1. ClientHello(我支持这些加密套件)    │
    │ ──────────────────────────────────►    │
    │ 2. ServerHello + 数字证书(含公钥)     │
    │ ◄──────────────────────────────────    │
    │ 3. 验证证书(查信任链、域名、有效期)   │
    │ 4. 用证书公钥加密「密钥材料」发过去     │
    │ ──────────────────────────────────►    │
    │ 5. 双方各自算出同一把「会话密钥」       │
    │ 6. 之后通信全程用会话密钥(对称)加密   │
    │ ◄════════ 加密的应用数据 ══════════►    │

逐步拆解:ClientHello —— 客户端告诉服务器"我支持这些加密算法";ServerHello + 证书 —— 服务器选定算法,并把数字证书发过来;验证证书 —— 客户端检查信任链能不能验到根 CA、域名对不对、有没有过期、有没有被吊销,任何一项不过浏览器就报"不安全";交换密钥材料 —— 客户端用证书里的公钥加密密钥材料发给服务器,只有服务器私钥能解;各自算出会话密钥 —— 双方根据握手中交换的信息,各自独立算出同一把对称会话密钥;开始加密通信 —— 之后所有应用数据都用这把会话密钥做对称加密。

TLS 1.3 与前向保密

上面是经典 RSA 密钥交换的简化描述。现代的 TLS 1.3(目前的主流)在此基础上做了两个重要改进,值得了解。

第一是握手更快:TLS 1.2 的握手需要两个来回(2-RTT),TLS 1.3 优化成了一个来回(1-RTT),对于"恢复之前的连接"甚至能做到 0-RTT。这是 HTTPS 在现代不再"慢"的重要原因。

第二是前向保密(Forward Secrecy):TLS 1.3 普遍改用 ECDHE 这类密钥交换算法,它的特点是 —— 每次会话的密钥都是"临时协商"出来的,且不直接依赖服务器的长期私钥。这意味着:即使服务器的私钥日后泄露了,攻击者也解不开他之前录下来的历史流量。而旧的 RSA 密钥交换没有这个保护 —— 私钥一旦泄露,过去所有用它加密的通信都能被回溯破解。前向保密是现代 HTTPS 一个非常重要的安全升级。

不过要记住:不管是 TLS 1.2 还是 1.3,"非对称协商出对称密钥、之后走对称加密"这个核心思想是一致的,变的只是具体算法和握手细节。

证书的几种类型:DV、OV、EV

不是所有 HTTPS 证书都一样,按"验证严格程度"分三类:

  • DV(域名验证):CA 只验证"你确实控制这个域名"(比如让你在 DNS 加一条记录)。签发快、免费的居多(比如 Let's Encrypt 就是 DV)。绝大多数网站用的都是 DV,对"加密"这件事来说它和其他类型没有区别。
  • OV(组织验证):CA 还会验证"申请方是一个真实存在的组织"。证书里会包含组织信息。多用于企业站。
  • EV(扩展验证):验证最严格,要核实组织的法律实体身份。早年浏览器会给 EV 证书显示绿色的公司名,现在大多数浏览器已经弱化了这个区别。

关键认知:DV / OV / EV 的区别在于"对网站身份的核实程度",不在于"加密强度"。加密强度三者完全一样。对个人博客、大多数网站,免费的 DV 证书完全够用 —— "免费证书不安全"是个误解。

HSTS:强制走 HTTPS

光有 HTTPS 还不够 —— 如果用户第一次输入网址时用的是 http://,那第一次请求还是明文的,可能在跳转到 HTTPS 之前就被攻击者劫持(SSL 剥离攻击)。

HSTS(HTTP Strict Transport Security)就是来堵这个洞的:网站通过一个响应头告诉浏览器"以后访问我,无论如何都直接用 HTTPS,别走 HTTP"。浏览器记住之后,哪怕用户手输 http://,浏览器也会在本地直接改成 HTTPS,根本不发出那个危险的明文请求。配置 HTTPS 时,加上 HSTS 是一个标准的加固动作。

常见的 HTTPS 报错,到底什么意思

理解了原理,浏览器那些"不安全"的报错就都能看懂了:

  • 证书过期 / 尚未生效:证书有有效期,过了就不被信任。服务器没及时续期是最常见原因 —— 这也是为什么要用自动续期工具。
  • 证书域名不匹配:你访问的域名,和证书上登记的域名对不上(比如证书是给 www.x.com 的,你访问的是 x.com)。
  • 证书不受信任 / 颁发者未知:证书的信任链验不到任何一个浏览器预装的根 CA —— 自签名证书报的就是这个。
  • 混合内容(Mixed Content):HTTPS 页面里又加载了 HTTP 的资源(图片、脚本)。那个 HTTP 资源是不安全的,会拖累整个页面,浏览器会拦截或警告。

HTTPS 保证了什么、没保证什么

HTTPS 保证的:机密性(传输内容被加密,中间节点看不到明文)、完整性(数据被改会被发现)、身份认证(你能确认连的确实是证书上那个域名)。

HTTPS 不保证的:

  • 网站本身是不是好人:钓鱼网站也能申请到合法的 DV 证书。小锁只代表"传输是安全的",不代表"这个网站可信"。
  • 你访问了哪个域名是完全保密的:加密的是内容,但你连的是哪个网站(域名/IP),旁观者一定程度上仍能看到。
  • 服务器内部的安全:数据一旦到了服务器,HTTPS 的使命就结束了。服务器自己被黑,HTTPS 管不着。

常见疑问

HTTPS 会让网站变慢吗?握手确实有一点开销,但 TLS 1.3 已经把握手压到很短,加上连接复用、会话恢复,实际影响微乎其微。而且 HTTP/2、HTTP/3 这些能大幅提速的新协议,浏览器只在 HTTPS 上启用 —— 综合下来,用了 HTTPS 的网站往往反而更快

自签名证书为什么浏览器报警?自签名证书没有经过任何受信任 CA 的背书,信任链验不到根 CA,浏览器无法确认它的真实性,所以警告。内网自用可以,对外服务务必用正规 CA 签发的证书。

免费证书(如 Let's Encrypt)安全性差吗?不差。前面说过,加密强度和付费证书完全一样,区别只在验证级别和有效期等。对绝大多数站点,免费 DV 证书完全够用。它唯一的"麻烦"是有效期较短(90 天),所以一定要配自动续期。

HTTP/2、HTTP/3 和 HTTPS 是什么关系?HTTP/2、HTTP/3 是更新的 HTTP 协议版本,主要解决"传输效率"问题(多路复用、头部压缩等)。它们在技术上不强制 HTTPS,但所有主流浏览器都只在 HTTPS 连接上启用它们。所以实践中,"用 HTTPS"和"能享受 HTTP/2、HTTP/3 的提速"是绑定的。

对称、非对称、哈希:再深入一点

前面把"对称加密"和"非对称加密"讲成了两个笼统的概念,实际工程里它们各自有不同的具体算法,分工也更细。了解一下,你看那些 TLS 配置、加密套件(cipher suite)的名字时就不会一头雾水。

常见加密算法的"分工":

  对称加密(快,加密大量数据)
    AES   —— 目前的事实标准,HTTPS 真正的数据传输几乎都用它
    ChaCha20 —— 在没有硬件加速的设备(如部分手机)上比 AES 更快

  非对称加密(慢,用于密钥交换 / 签名)
    RSA   —— 老牌,基于大数分解难题,密钥较长
    ECC / ECDHE —— 椭圆曲线,更短的密钥达到同等安全强度,现代主流

  摘要 / 哈希(用于完整性校验、签名)
    SHA-256 等 —— 把任意数据压成固定长度的"指纹",数据一改指纹就变

对称加密这一侧,真正干"加密海量传输数据"这件活的,基本就是 AES —— 它是经过了几十年考验的事实标准。还有一个 ChaCha20,它在那些没有 AES 硬件加速的设备(比如一些移动设备)上反而更快,所以现代 TLS 会根据设备情况在两者间选。

非对称加密这一侧,经历了一次重要的演进:老牌的 RSA 基于"大数分解很难"这个数学难题,但它要达到足够安全强度,密钥就得很长(2048 位、4096 位)。后来 ECC(椭圆曲线密码)登场,它能用短得多的密钥达到同等的安全强度 —— 更短意味着更快、更省。现代 HTTPS 的密钥交换,大量用的是基于椭圆曲线的 ECDHE,这也是前面讲"前向保密"时提到的那个算法家族。

还有一类容易被忽略但同样关键的角色 —— 哈希算法(如 SHA-256)。它把任意长度的数据压成一个固定长度的"指纹",特点是数据只要改动一个比特,指纹就面目全非。它在 HTTPS 里负责"完整性"那部分:数据有没有在传输中被篡改,靠对比哈希就能发现。前面讲的"数字签名",底层也用到了哈希 —— 先对数据算哈希,再对哈希做非对称运算。

所以一次完整的 HTTPS 通信,其实是这三类算法协作的结果:非对称算法负责"安全地把对称密钥交换好",对称算法负责"高速加密真正的数据",哈希算法负责"校验数据没被改、并支撑签名验证"。理解了这个分工,你就明白为什么 HTTPS 不是"一个算法",而是"一套密码学组合拳"。

证书是怎么"作废"的:CRL 与 OCSP

证书有有效期,过期会自然失效。但如果一张证书还没到期、却出了问题 —— 比如网站的私钥泄露了,或者证书是被错误签发的 —— 怎么办?总不能等它自己过期。这就需要"吊销"机制。

第一种机制是 CRL(证书吊销列表):CA 维护一份"已被吊销的证书"的名单,浏览器定期下载这份名单,验证证书时查一下它在不在名单里。问题是这份名单可能很大、更新也不够及时。

第二种是 OCSP(在线证书状态协议):浏览器不下载整个名单,而是针对"这一张证书"实时去问 CA"它还有效吗"。更及时,但带来了新问题 —— 每次都去问,既慢、又把"用户访问了哪个站"暴露给了 CA。

于是又有了 OCSP Stapling(装订):让网站服务器自己定期去 CA 那里取一个"我的证书还有效"的签名凭证,然后在 TLS 握手时直接"装订"给浏览器。这样浏览器不用自己去问 CA,既快、又保护了隐私。

对普通开发者来说,你不太需要手动操心这些 —— 但理解"证书可以被提前吊销、且有一套机制让浏览器知道"这件事很重要。它解释了为什么"私钥泄露"是件大事:私钥一旦泄露,你必须尽快吊销旧证书、换新的,否则攻击者能拿着你的旧证书冒充你的网站。

实战:给一个网站配置 HTTPS 的完整步骤

把原理落到地上 —— 如果你要给自己的网站配 HTTPS,大致流程是这样的:

给一个网站配 HTTPS 的完整步骤(以免费证书为例):

  1. 你得先有一个域名,并且能管理它的 DNS 解析
  2. 用 ACME 客户端(如 Certbot、acme.sh)向 CA 申请证书
       —— CA 会让你证明"你确实控制这个域名"(在 DNS 加条记录,
          或在网站根目录放个验证文件)
  3. 验证通过,CA 签发证书,你拿到两个文件:证书 + 私钥
  4. 在 Web 服务器(Nginx / Apache)配置里指向这两个文件,
     并把 80 端口的 HTTP 请求重定向到 443 的 HTTPS
  5. 配置自动续期(免费证书有效期通常 90 天)—— 这一步最容易被忘
  6. (加固)加上 HSTS 响应头、关掉过时的 TLS 1.0/1.1

这里面有几个点值得展开说。第一,域名验证:CA 不会随便给你签证书,它必须先确认"你确实控制这个域名"。验证方式通常是让你在 DNS 里加一条特定记录、或者在网站根目录放一个特定文件 —— CA 去检查,看到了就说明这个域名归你管。

第二,证书 + 私钥这两个文件:申请成功后你会拿到一对文件。私钥是绝对机密的,只能存在你的服务器上,绝不能泄露、绝不能提交到代码仓库 —— 它泄露了,整套加密就被攻破了。证书则是公开的(本来就要发给每个访客)。

第三,HTTP 跳 HTTPS:配好 HTTPS 后,要把访问 80 端口(HTTP)的请求,自动重定向到 443 端口(HTTPS),否则用户手输 http:// 还是走的明文。再配合前面讲的 HSTS,才算把"明文访问"这条路彻底堵死。

第四,自动续期 —— 这是最容易翻车的一步:免费证书有效期通常只有 90 天,到期不续,网站立刻就全站报"不安全"。所以一定要配好自动续期的定时任务,并且最好加上"续期失败告警"。无数网站的"突然全站不安全"事故,根源都是这一步没做好。

现在有很多工具(ACME 客户端、宝塔面板、云厂商的一键配置)把这套流程做得很傻瓜化了,但理解每一步在做什么,出了问题你才知道去哪儿查。

HTTPS 防不住什么:它不是万能的

HTTPS 解决了"传输通道"的安全问题,但安全是一条很长的链条,HTTPS 只是其中一环。清楚它的边界,才不会有"上了 HTTPS 就高枕无忧"的错觉。

防不住"网站本身是恶意的"。钓鱼网站、诈骗网站,照样能申请到合法的 HTTPS 证书,地址栏照样有小锁。小锁的含义只是"你和这个网站之间的传输是加密的、对方确实是这个域名",它完全不代表"这个网站是好人、这个网站值得信任"。这是最需要向普通用户澄清的一个误解。

防不住"端点"被攻破。数据加密传输,但传到服务器之后呢?如果服务器本身被黑了、数据库被拖了,HTTPS 一点忙都帮不上。同样,如果用户的电脑中了木马,在数据进入浏览器加密之前就被截获了,HTTPS 也无能为力。HTTPS 保护的是"路上",保护不了"两头"。

防不住"应用层"的漏洞。SQL 注入、XSS 跨站脚本、CSRF、越权访问 —— 这些是网站代码层面的漏洞,和"传输加不加密"是两个维度的事。一个有 SQL 注入漏洞的网站,套上 HTTPS,漏洞还在那儿,只不过攻击者的注入请求是"加密发送"的而已。

防不住流量分析。前面提过:HTTPS 加密的是内容,但你访问了哪个域名、数据包的大小和时间规律,旁观者仍能看到一部分。在某些场景下,光靠这些"元数据"也能推断出不少信息。

所以正确的认知是:HTTPS 是 Web 安全的"地基"和"必选项",但它只是地基,不是大厦的全部。一个真正安全的网站,需要 HTTPS + 安全的服务器配置 + 没有应用层漏洞的代码 + 良好的认证授权设计 + ……。把 HTTPS 配好是第一步,但绝不是最后一步。

写在最后

HTTPS 的精巧之处,在于它不是某一个"银弹算法",而是一套层层补漏的设计:对称加密快但传不了钥匙 → 用非对称加密传钥匙 → 但公钥可能被掉包 → 用 CA 证书体系来认证身份 → 第一次明文请求有风险 → 用 HSTS 强制 → 私钥泄露怕回溯 → 用前向保密。每一步都在解决上一步留下的问题,环环相扣。

下次再看到地址栏那把小锁,你脑子里应该能浮现出这一整套机制 —— 对称与非对称、CA 与信任链、握手与会话密钥、前向保密与 HSTS。能把这一串讲清楚,你对 HTTPS 的理解就不再是"知道它加密了",而是"真正看懂了它怎么加密、为什么这么设计"。

—— 别看了 · 2026
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理 邮箱1846861578@qq.com。
技术教程

Ollama 完全上手指南:在本地免费跑 DeepSeek、Llama 等大模型

2026-5-14 16:32:31

技术教程

数据库索引为什么用 B+ 树?从原理到实战的深度解析

2026-5-14 17:12:11

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索