ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

HTTP与HTTPS区别详解:从明文传输到TLS加密,一篇文章搞懂网站安全

HTTP与HTTPS区别详解:从明文传输到TLS加密,一篇文章搞懂网站安全 开门见山说一个很多人忽略的事你在浏览器地址栏里敲了无数次的http://和https://本质上就是两个前缀差一个字母背后的安全等级却差了一整个时代。零基础完全不需要背协议栈只要抓住一个核心比喻——明信片和带锁快递箱——就能把 HTTP 和 HTTPS 的区别理解得明明白白。这篇文章我会把它讲到能动手验证的程度包括端口、证书、TLS 握手、性能开销以及我在实际排查中遇见过的高频问题。适合刚入行的前后端、运维、测试也适合只是好奇“为什么有些网站前面有个锁”的普通用户。1. 先搞清楚HTTP是什么一个快递员的日常1.1 HTTP的全名与核心职责HTTP 全称 HyperText Transfer Protocol翻译过来是“超文本传输协议”。它诞生于 1991 年前后整个万维网就是建立在它之上的。你可以把它理解为快递行业的面单规范寄件人、收件人、物品信息、地址都写在固定位置快递员不管寄的是蛋糕还是文件只要按这套格式干活就行。HTTP 的职责是约定一套“请求-响应”格式。客户端通常是浏览器向服务器发请求请求里带着“我想访问哪个路径、用什么方法、带什么参数”服务器处理后返回响应响应里带着“状态码、内容类型、具体数据”。这套格式只要双方都遵守任何语言写的服务器都能互通这就是它最了不起的地方。用餐厅点菜来类比请求相当于“来一份宫保鸡丁不要辣”响应相当于厨房端出来的那盘菜。请求行告诉服务员你要干什么请求头是备注口味、忌口、会员号请求体就是具体内容响应头的状态行相当于“您的菜好了”响应体就是菜本身。理解了这套你来我往的语言再看 HTTP 报文就不会发怵。1.2 HTTP的“明信片”式通信模型HTTP 的一个关键特征是报文全程明文。把 HTTP 报文想象成一张明信片你写下的话每一个经手的中转站都能看到。这里要明确一个容易被误会的点HTTP 明文是“传输过程中的内容可见”不是“网站上所有文件都公开”。当你提交一个登录表单账号密码会原封不动地出现在协议包里沿途任何能接触到这条网络路径的设备——路由器、交换机、运营商机房——都能读到。更扎心的是如果中间有人恶意截取并篡改内容接收方完全感知不到因为它收到的就是“被改过的原文”。HTTP 通信还有一个特点无状态。服务器默认记不住你是谁每个请求都是独立的。你登录了购物网站下一次请求时服务器已经忘了你。解决办法是 Cookie——服务器在响应里塞一张“会员卡”给浏览器浏览器下次请求时主动带上它服务器一看卡片就知道你是谁。1.3 HTTP为什么能活这么多年HTTP 能几十年不退休是因为它足够简单、灵活、可扩展。头部字段Header可以随意扩展想要增加新功能就加一个新字段不必推翻整个协议。而版本演进也一直没停过HTTP/1.1 统治多年HTTP/2 通过多路复用解决了队头阻塞HTTP/3 直接改用 UDP 协议族进一步降低延迟。但它的核心缺陷——明文传输——在商业应用越来越普及后就成了致命伤。这也正是 HTTPS 登上历史舞台的根本原因。2. HTTPS到底是什么给快递加了一把锁2.1 HTTPS HTTP TLS/SSLHTTPS 的完整名字其实是“HTTP over TLS”。上世纪 90 年代网景公司为了解决网上购物时信用卡号被窃取的问题发明了 SSL后来标准化成 TLSHTTPS 就是在 HTTP 和 TCP 之间多插入了一个安全层。你可以把协议栈想象成寄快递的流程HTTP 负责写内容TLS 负责把内容锁进保险箱TCP 负责运输。三层各司其职各层协议都只处理自己该处理的事。有个冷知识HTTPS 本身没有创造新的应用协议它只是给 HTTP 穿了一件防弹衣。浏览器和服务器之间的对话方式、报文格式HTTP 原来怎么定义现在还是怎么定义只是这些报文在被送到 TCP 之前先被 TLS 加密了一遍。这也是为什么“HTTPS 解密后看到的仍然是 HTTP 报文”——你换的只是传输通道不是行李本身。2.2 这把锁解决的三件事加了 TLS 这层锁解决的是三类安全问题机密性防窃听。内容加密后中间人截获到的是一堆乱码。就像把明信片塞进带锁的密封箱快递员能看到发件地和收件地但不知道里面写了什么。完整性防篡改。TLS 给每个报文都做了摘要校验任何一位被篡改接收方都会发现货不对板。相当于快递箱上有防拆封条有人动过手脚你会立刻察觉。身份认证防冒充。服务器要通过数字证书证明“我就是我”防止有人伪装成银行网站骗你输入密码。相当于快递员亮出工牌你先核验身份再收件。这三件事是 HTTPS 存在意义的全部。它不负责解决网站本身是否干净也不负责内容是否合法它只保证“你在访问的那个服务器是真的”和“你和它之间说话的内容没人看得懂、改不动”。2.3 端口为什么是80和443端口就像快递业务的分拣口。HTTP 默认走 80 端口HTTPS 默认走 443 端口这是互联网号码分配机构IANA规定的“默认值”。规定出来之前各家服务器软件就开始用这两个数字了久而久之成了行业惯例。你在地址栏输入http://example.com时浏览器默认帮你补上:80输入https://example.com时默认补上:443。如果你在网址后面手动写:8080或:8443那是服务器管理员自定义的端口浏览器一样能访问只是地址栏里会明确显示出来。一个小实战经验当你访问一个网站报连接超时先用telnet 域名 80和telnet 域名 443分别测一下如果 80 通但 443 超时基本可以断定是服务器或网络设备没放行 HTTPS 流量和协议本身没关系。2.4 HTTPS也有“不加密”的部分很多人以为 HTTPS 是全链路加密、任何信息都看不到这个理解是有偏差的。TLS 只加密“传输内容”不加密“传输元数据”。所谓元数据就是目标 IP 地址、目标端口、数据包大小、连接时间、流量特征。最容易被忽略的是 SNIServer Name Indication——TLS 握手时客户端必须明文告诉服务器“我要访问哪个域名”服务器才能找到对应证书完成后续握手。也就是说你在 HTTPS 网站上看什么域名网络路径上的人依然看得到。另外DNS 解析在传统场景下也是明文你访问哪个网站DNS 服务器和网络设备都留有记录。说这些是想纠正一个误区HTTPS 不是隐身斗篷它保护的是账号密码、聊天内容、支付信息这些真正的“私密行李”而不是“你正在访问某个网站”这件事本身。3. 深度拆解TLS握手到底在打什么3.1 三种加密武器的分工要理解 TLS 握手先得认识三种加密技术对称加密比如 AES。加密和解密用同一把钥匙速度快得惊人适合加密大量数据。但问题来了这把钥匙如果通过网络传给对方中间人也能拿到。非对称加密比如 RSA、ECC。使用一对钥匙公钥加密、私钥解密。公钥可以公开分发私钥只保存在服务器自己手里。加密慢但能安全地传递关键信息。哈希算法比如 SHA-256。把任意长度的数据算出一段固定长度的摘要改一个字节摘要就变。它不是加密无法还原原文而是用来校验完整性。TLS 的思路是用非对称加密安全地协商出一把临时“会话密钥”之后所有数据都用这把会话密钥做对称加密。打个比方你俩先用保险箱互相传递了一把房门的临时钥匙谈好之后就用临时钥匙自由进出不用每次开门都搬保险箱。3.2 一次握手的四步流程用 TLS 1.2 简化版流程说明TLS 1.3 有优化但思路一致第一步客户端打招呼ClientHello浏览器向服务器发送它支持的 TLS 版本列表、加密套件列表、以及一个随机数。第二步服务器回应ServerHello服务器从中挑一个双方都支持的加密套件发回自己的证书和另一个随机数。第三步验证与密钥交换客户端验证服务器证书是否可信、域名是否匹配然后生成一个预主密钥用服务器的公钥加密后发给服务器。双方根据随机数和预主密钥各自算出同一把会话密钥。第四步加密通信双方互发“Finished”消息确认握手成功之后所有 HTTP 数据都使用会话密钥进行对称加密传输。TLS 1.3 把流程压缩成一个往返1-RTT并且支持会话恢复后的 0-RTT 快速握手。现代网站普遍启用 TLS 1.3 后握手带来的延迟已经大幅减少。3.3 数字证书与CA信任链服务器证书到底是什么它就是服务器的一张“数字身份证”里面包含域名、公钥、有效期、颁发机构以及颁发机构对这份信息的签名。当浏览器验证证书时走的是链式信任操作系统内置了一批根证书颁发机构CACertificate Authority的公钥像通讯录里存着一批可信任的“公证处电话”。服务器证书通常由 CA 签发签发过程还可能经过一个中间 CA形成“根证书 - 中间证书 - 服务器证书”的链条。浏览器只要在本地找到任一能追溯到根证书的签名链路就认为这张证书可信。这也是为什么自签名证书会被浏览器警告——它没有链式信任相当于身份证是由你自己给自己开的证明别人当然要核对一下。个人开发调试时用自签名证书没问题生产环境一定要用正规 CA 的证书。Lets Encrypt 这类免费 CA 就专门解决个人和小站点拿不到正规证书的问题90 天自动续期配合脚本基本免维护。3.4 HTTPS到底慢不慢在零基础这个话题里“HTTPS 比 HTTP 慢”是出现频率最高的误解之一。早年确实有性能差距因为一次 HTTPS 连接要在 TCP 三次握手之后再多做 TLS 握手多出 1-2 个网络往返RTT。但到了今天情况已经彻底变了。首先TLS 会话恢复机制让重复访问的握手成本降到几乎为零。其次主流浏览器和服务器对 HTTP/2 的启用前提几乎都是 HTTPSHTTP/2 的多路复用、头部压缩、服务器推送带来的性能提升远远抵消了 TLS 握手的开销。我迁移过几个线上项目同一个页面从 HTTP/1.1 改成 HTTPS HTTP/2 之后首屏加载时间不仅没变慢反而平均快了 15% 以上主要就是多路复用解决了多个小文件并发加载的等待。所以这个问题的真实答案是HTTPS 的“慢”只体现在第一次握手多花的几十毫秒往后反而可能更快。4. 零基础也能动手验证实操对比HTTP与HTTPS4.1 先看浏览器地址栏最简单直观的验证方法就是打开一个 HTTPS 网站观察地址栏左侧的锁图标。点击锁图标能看到“连接安全”的说明继续点“证书有效”还能看到证书的颁发者、有效期、域名匹配情况。对比一下纯粹的 HTTP 网站地址栏通常显示“不安全”标记甚至直接标红。我自己检查网站配置时第一步永远是打开浏览器看地址栏——这个动作快过任何复杂的校验工具。注意一个细节锁图标只代表“传输通道加密”不代表“网站可信”。钓鱼网站也能申请到正规证书所以不要因为地址栏有锁就放心大胆地输入密码。4.2 用curl看两种协议的报文差异命令行工具 curl 是观察 HTTP 和 HTTPS 差异的好帮手。打开终端输入curl -v http://example.com-v参数会输出完整通信过程。HTTP 版本下你能直接看到请求头和响应头的每一行明文路径、User-Agent、Cookie 全都赤裸裸地躺着。再试试curl -v https://example.com输出里会多出一大段 TLS 握手过程。关键行长这样* SSL connection using TLSv1.3 / AEAD-AES256-GCM-SHA384 * ALPN: server accepted h2这两行说明了三个信息TLS 版本是 1.3加密套件是 TLS_AES_256_GCM_SHA384且协商出了 HTTP/2h2。相比之下HTTP 的 curl 输出里永远看不到这些行。4.3 本地起一个HTTP服务做对照实验想看得更真实可以本机开一个 HTTP 服务。装好 Python 后在某个目录里执行python3 -m http.server 8000浏览器访问http://127.0.0.1:8000地址栏会明确显示“不安全”。这时配合浏览器开发者工具里的“网络”面板点开任意一个资源的请求看它的“请求头”区域——Host、User-Agent、Cookie 全部明文显示。这个实验完全不涉及外部网络非常适合零基础自己动手感受“什么是明文”。4.4 用openssl查看目标网站证书排查证书问题时openssl 是最好用的工具。执行openssl s_client -connect example.com:443 -servername example.com 2/dev/null | openssl x509 -noout -subject -issuer -dates输出里能看到证书的颁发对象、颁发机构、起止时间。我排查线上证书过期问题时靠这一条命令就能快速确认“是谁的证书、什么时候到期、由谁签发”比打开浏览器一层层点证书详情高效得多。顺便提一句Chrome 的开发者工具也有个常被忽略的面板Network 标签页里右键列表头勾选“Protocol”列就能看到每个资源走的是 h2、http/1.1 还是 HTTP/3。这列信息在查性能问题时非常有用——如果全站都是 http/1.1那你还停留在旧版协议上该考虑升级了。5. 实际使用中的高频问题与排查清单5.1 证书报错全家桶我处理过大量证书相关的工单常见报错就那几类一次性列清楚浏览器报错实际原因快速排查方向NET::ERR_CERT_DATE_INVALID证书过期或本地系统时间不对先校准系统时间再用 openssl 看证书有效期NET::ERR_CERT_COMMON_NAME_INVALID证书域名与访问域名不匹配确认访问域名是否写进证书 SAN 列表NET::ERR_CERT_AUTHORITY_INVALID自签名证书或不受信任的 CA检查证书链是否完整是否缺少中间证书NET::ERR_CERT_REVOKED证书已被吊销联系 CA 重新签发检查 OCSP 状态很多人第一反应是“证书出问题了”但经验告诉我报CERT_DATE_INVALID时相当一部分是用户电脑系统时间跑偏了尤其是长期不关机的Windows笔记本。排查顺序永远应该是先看本机时间再看证书有效期最后查域名匹配。5.2 混合内容警告这是网站从 HTTP 迁到 HTTPS 后最常见的坑。HTTPS 页面里却加载了一个 HTTP 资源比如外链图片、第三方统计脚本、CDN 文件浏览器会在控制台提示 Mixed Content并在地址栏把锁图标变成感叹号。为什么浏览器要拦截因为加密页面里混入明文资源等于你住进保险库却把窗户敞着——攻击者只要劫持那个 HTTP 资源就能在加密页面里植入恶意代码。解决办法很直接把所有内部资源彻底改成 HTTPS 链接外链资源优先选同时支持 HTTPS 的 CDN如果第三方资源实在没有 HTTPS 版本就要在服务器上做一层转发。更省心的做法是配置 HTTP 响应头Content-Security-Policy: upgrade-insecure-requests让浏览器自动把页面里的 http 请求升级成 https。5.3 状态码快速识别400、405、502到底在说什么看到状态码就心里发虚其实常见状态码就那十几个。说几个高频的400 Bad Request请求本身格式有误。URL 太长、请求头解析失败、请求体格式不对都会触发。排查时重点看是不是带了非法字符或超大参数。405 Method Not AllowedURL 路径存在但服务器不允许你用这个方法。比如路由只注册了 GET你却发了个 POST。不少新手在写 API 接口测试时撞上它改一下请求方法就好。502 Bad Gateway网关或上游服务器返回了无效响应。常见场景是 Nginx 反向代理后面的应用服务挂了、超时了、或没启动。我在本机调试时遇到过几次 502一查根本不是协议问题就是本地服务进程崩溃了。看这个状态码先别怀疑 HTTPS 配置直接看上游日志。5.4 从HTTP升级到HTTPS的正确流程如果你的网站还在 HTTP想全面升级建议按这个顺序走申请证书个人站长直接使用 Lets Encrypt 免费证书用 acme.sh 之类脚本申请和续期。部署证书把证书文件和私钥配置到 Web 服务器上Nginx、Apache、IIS 都有标准配置段落。做 301 跳转让所有 HTTP 访问自动跳到 HTTPS既保留用户习惯也利于搜索排名转移。开启 HSTS设置Strict-Transport-Security响应头告知浏览器以后只用 HTTPS 访问本站。全面替换资源把页面里的 http 链接、CDN 域名、接口地址全部更新为 https这一步最容易漏。验证与更新 SEO用搜索引擎提供的工具提交新站点地图同时检测证书部署是否正常。升级过程中最常见的失误是证书到期忘了续期——不少用户第一次配置 Lets Encrypt 时没用自动化脚本90 天后整站突然恢复“不安全”。强烈建议从一开始就配 crontab 定时任务自动续期并加一个到期前主动报警的脚本。5.5 一个常被问到的细节为什么有些请求还是HTTP很多用户发现就算访问的是 HTTPS 网站某些请求仍然是 http 开头。这通常有三种来源第三方的统计脚本、外链图片、或者旧版 App 内部硬编码的接口地址。处理原则很简单能改就改成 https改不了就加转发。但如果一个 HTTPS 站点长期存在大量 http 子请求就失去了上 HTTPS 的一大半意义。6. 我踩过的一些坑和最后的建议最后聊点实操中的体感。我最早做完一个站的 HTTPS 迁移时以为改完证书、配上跳转就万事大吉结果被混合内容警告折腾了一下午——页面里漏了两条来自老域名的 http 图片链。后来学乖了迁移完第一时间打开控制台把 Console 里的 Mixed Content 提示当作 P0 问题处理。还有一次是本地抓包排查问题发现 HTTPS 流量全被中间证书不完整的问题挡住客户端 Chrome 因为缺中间证书一直报错服务器日志却显示 TLS 握手已经完成两边各说各话。这让我养成一个习惯排查 HTTPS 问题永远同时看客户端错误详情和服务器端 TLS 日志不能只看一边。对于零基础的朋友我的建议是不必急着背证书原理或握手细节先从观察开始。用浏览器地址栏、开发者工具、curl 命令把 HTTP 和 HTTPS 的报文差异亲眼看过一遍再回来看理论一切都会变得非常好懂。如果这篇文章能让你下次在地址栏看到https://时多一分“我知道它在保护什么”的踏实感那就值了。
返回列表