ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

HTTP与HTTPS的区别详解:从明文传输到TLS加密证书的完整原理

HTTP与HTTPS的区别详解:从明文传输到TLS加密证书的完整原理 1. 从地址栏的小锁说起我们每天都在用却不一定懂的两个词你有没有注意过浏览器地址栏里有些网址前面有个小锁图标有些却显示“不安全”三个字。以前我没做技术这行的时候只觉得小锁是“正规网站”的标志锁上了就放心填密码、付款。后来自己开始折腾网页、搭服务器、写接口才真正搞清楚那个小锁背后藏着一整套复杂的加密通信机制——就是标题里说的HTTPS。而HTTP则是互联网上最基础的传输协议所有网页请求的底层都离不开它。这篇博文就是写给零基础的朋友看的我会把HTTP和HTTPS的区别、HTTPS为什么安全、它们各自解决了什么问题拆成大白话一点点讲清楚保证你看完能跟别人聊明白这俩东西。先给你一个最直观的结论HTTP是明文传输的协议HTTPS是HTTP加上加密和身份验证之后的版本。这中间多出来的“S”全称是Secure意思就是“安全”。可别小看多出来的这一步它解决的是互联网通信里最要命的问题——你发的信息中途会不会被别人偷看、篡改以及你连上的服务器到底是不是你想访问的那台。这篇内容适合谁看如果你是刚开始学网络基础、准备面试的应届生或者工作中经常跟接口、网址打交道但一直没搞懂原理的开发、测试、运维又或者单纯好奇每次打开网页后台发生了什么那这篇就是为你写的。我不会堆专业术语每个概念都会用人话解释一遍再配上实际场景告诉你怎么用、怎么判断。先剧透一个我自己的经历我刚学抓包工具的时候用Wireshark随便拦了一下局域网里的HTTP流量结果密码、昵称、聊天内容全都能直接读出来那一刻真的被震惊到了。所以HTTPS的价值绝对不是“多此一举”而是现代互联网的底线。2. HTTP的“裸奔”真相为什么它能跑通却守不住秘密要理解HTTPS必须先理解HTTP的局限。2.1 HTTP到底在做什么一次请求的完整路线HTTPHyperText Transfer Protocol超文本传输协议规定的其实特别简单客户端比如浏览器向服务器发送一个请求服务器回一个响应。请求里写着你想干什么——访问哪个网页、提交什么表单、下载哪个文件响应里则装着服务器要给你的内容——网页的HTML代码、图片数据、JSON数据等等。整个过程可以类比成“寄明信片”。你把要说的话写在明信片上贴上邮票投进邮筒邮递员一路把它送到收件人手里。这个过程里每一个经手的中转站——邮局、分拣员、运输车上的人——都能看见明信片上的内容。HTTP就是这种明信片式的通信内容完全透明经手的人都能读。具体到技术层面一次HTTP请求长这样GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 Accept: text/html这就是浏览器发给服务器的一段纯文本。服务器收到后回复一段类似这样的内容HTTP/1.1 200 OK Content-Type: text/html; charsetutf-8 Content-Length: 1234 html.../html看到关键点了吗整段通信没有任何加密处理请求头、响应头、正文全是纯文本。你用HTTP访问一个网页那么你浏览了哪个URL、携带了什么Cookie、填写了什么表单内容沿途的路由器、Wi-Fi热点、运营商设备理论上全都能看到。2.2 明文传输到底有多危险三个真实场景很多人觉得“我又不是什么大人物谁没事偷看我的流量”。这种想法在早年间还能说得过去但放到今天就太天真了。第一个场景是公共Wi-Fi。你在咖啡馆连上一个不设密码的Wi-Fi这时你的手机发送的所有HTTP请求都会经过那个Wi-Fi路由器。只要路由器的主人稍微懂点技术开的抓包工具就能把你的流量全部还原成明文。你在这时候登录某个不支持HTTPS的网站账号密码就等于直接写在了空中。第二个场景是运营商或中间设备的篡改。因为HTTP流量是透明的中间的任何节点都可以在响应内容里插入一段额外的JS代码。前些年常见的“流量劫持弹广告”就是这种手法——你打开一个普通网页页面里莫名其妙多了一整屏的推广弹窗实际上就是中间节点篡改了响应内容往网页HTML里塞了广告脚本。第三个场景是隐私泄露。HTTP请求会带上完整的URL路径和查询参数比如https://example.com/search?keyword感冒药这种信息一旦被第三方截获你的行为轨迹、搜索习惯、健康状况都会暴露。更别说有些老系统会在URL参数里直接带token、session id那等于把家门钥匙别在门框上告诉别人。2.3 HTTP也不是一无是处它的优点和适用场景说了这么多HTTP的坏话但HTTP本身并不是一个“落后”或“错误”的协议。它到今天仍然是互联网的基石因为它有两个极其重要的优点简单和兼容性好。实现简单HTTP报文就是纯文本任何人都能读懂调试工具随便一抓就能看到内容排查问题非常方便。我本地开发时经常直接开HTTP就是为了方便看报文。性能开销小没有加密协商的过程连接建立更快CPU消耗更低。在传输不敏感数据的内部网络中比如公司内网监控系统、局域网打印机通信HTTP完全够用。所以HTTP真正的问题不是“不能跑”而是“不安全”。HTTPS要做的就是保留HTTP这种简单明了的请求响应模型在它外面包上一层加密保护壳。3. HTTPS的加密体系拆解对称加密、非对称加密和证书到底在解决什么问题HTTPS全称是HyperText Transfer Protocol Secure翻译过来是“超文本传输安全协议”。注意它的名字——“HTTP Secure”它不是推翻HTTP另搞一套而是在HTTP下面加了一层安全传输机制。这一层最核心的组件叫TLSTransport Layer Security传输层安全协议。你可以把TLS理解成“保险箱服务”。HTTP原本是明信片现在我们把明信片装进保险箱再邮寄。保险箱解决了三件事只有收件人能打开加密性、运输过程中没人能掉包完整性、开箱的人确实是收件人本人身份认证。这三个目标分别对应三种技术手段。3.1 对称加密速度快但钥匙不好送先看加密本身。加密算法里最简单直观的是对称加密——加密和解密用同一把钥匙。就好比你有一个带锁的盒子钥匙只有一个你用这把钥匙锁上收件人用同一把钥匙打开。对称加密的优点非常明显计算速度快几百兆的数据也能轻松加密解密。我们上网看的视频、下载的文件、刷的网页数据量动不动就几MB甚至几百MB如果用慢吞吞的复杂算法处理体验会非常糟糕。所以实际传输内容时用的都是对称加密算法比如AES。但对称加密有个致命问题钥匙怎么送到对方手里如果钥匙也跟着数据一起在网上传输那中间人截获了钥匙就能解开所有内容加密形同虚设。3.2 非对称加密两把钥匙解决钥匙配送问题于是有了非对称加密。它使用一对钥匙公钥和私钥。公钥可以随便分发私钥只有自己知道。用公钥加密的内容只能用对应的私钥解开用私钥加密的内容只能用对应的公钥解开。打个比方公钥是“锁”私钥是“钥匙”。你买了一个信箱把挂锁公钥打开挂在信箱上任何人都可以看到这把锁可以把信投进去。但信箱的钥匙私钥只有你自己有只有你能打开信箱取信。这套机制解决了一个问题内容加密的钥匙不需要提前约定。客户端拿到服务器的公钥用公钥把数据锁好发过去只有服务器能用私钥解开。就算中间人拿到了公钥也解不开那些数据。但非对称加密的缺点是慢非常慢。RSA算法处理大量数据的效率远低于AES。所以实际应用中HTTPS的加密方式是“混合加密”先用非对称加密协商出一个临时的对称密钥叫“会话密钥”之后的实际数据全部用这个会话密钥进行对称加密传输等这次通信结束会话密钥就丢弃下次重新协商。这套流程兼顾了安全性和性能是HTTPS能在真实世界中大规模使用的基础。3.3 中间人攻击光有加密还不够还得证明“你是你”混合加密已经解决了“数据不被偷看”的问题但还有一个漏洞如果中间人伪造一个公钥发给客户端呢举个例子。你想访问银行网站但你的网络被劫持了发给你的网站页面被换成一个假的钓鱼网站。这时钓鱼网站也向你发来一个“公钥”你用这个公钥加密了账号密码发过去正好被钓鱼站解开——它获得了你的密码而真正的银行什么都没收到。这就是经典的中间人攻击。光有加密不够客户端必须确认一件事我拿到的这个公钥真的是目标服务器的公钥而不是别人冒充的。解决这个问题的办法就是证书。3.4 数字证书互联网世界的身份证数字证书可以理解成网络世界的身份证。它由第三方权威机构——CACertificate Authority证书颁发机构签发。CA机构会核实申请者的身份信息确认“你就是你”然后颁发一张证书。证书里包含了服务器的公钥、域名、有效期、持有者信息以及CA机构用自己私钥对以上内容做的数字签名。客户端验证证书时会做这样几步用CA机构的公钥去验证证书上的数字签名确认这张证书确实是由可信CA签发的、没有被篡改过检查证书上的域名和当前访问的域名是否一致检查证书的有效期是否过期检查证书是否被吊销。如果这些全部通过客户端才认定“这是真正的服务器”然后放心地使用证书里的公钥进行加密通信。这套体系里最重要的是“信任根”。你的浏览器或操作系统里内置了一批可信CA的根证书这些CA是全世界都认可的权威机构。浏览器就是靠内置的这批根证书去验证服务器证书的真伪。4. 一次完整的TLS握手从“你好”到“开始加密”的每一步上一步我们讲了HTTPS用到的加密技术现在把它们串起来看一次完整的HTTPS连接是怎么建立的。这个过程在专业术语里叫“TLS握手”。4.1 握手的详细流程假设你在浏览器里输入https://www.example.com按下回车。这时你的浏览器和服务器之间除了TCP三次握手建立连接之外还多了一段TLS握手过程。我按顺序拆开讲。第一步客户端发送ClientHello浏览器生成一个随机数称为Client Random把它和自己的TLS版本号、支持的加密算法列表一起发给服务器。这一段是明文传输的因为此时双方还没建立任何加密通道。第二步服务器发送ServerHello 证书服务器收到后也生成一个随机数Server Random从客户端支持的算法列表里挑一套双方都支持的加密方案连同自己的证书一起发回来。第三步客户端验证证书这是关键一步。客户端拿到服务器的证书后会按照前面说的流程验证证书是否可信——签名是否有效、域名是否匹配、是否过期。如果验证失败浏览器会直接弹出警告页面提示“您的连接不是私密连接”或“不安全”。如果你在用的是真正的网站但证书有问题那说明很可能有人在做中间人劫持或者网站自己的证书配置出错了。验证通过后客户端从证书里取出服务器的公钥。第四步客户端生成预主密钥并加密发送客户端生成第三个随机数称为Premaster Secret预主密钥用服务器的公钥加密后发送给服务器。因为是用公钥加密的只有持有对应私钥的服务器才能解开中间人截获了也没用。第五步双方生成会话密钥服务器用私钥解出预主密钥。此时双方都拥有了三个随机数Client Random、Server Random、Premaster Secret。把这三个随机数通过特定算法混合运算就能分别生成同一个“会话密钥”。注意会话密钥是双方独立计算出来的并没有在网络上直接传输过。第六步切换加密通信双方互相发送一条“Finished”消息表示自己已经准备好使用加密通信了。这条消息是用会话密钥加密的。从这一刻开始之后的所有HTTP请求和响应全部使用会话密钥进行对称加密传输。4.2 握手过程的表格速览为了帮你快速回顾我把上述过程整理成一张表步骤发送方内容是否加密1客户端ClientHello随机数、支持的加密算法明文2服务器ServerHello随机数、选定的算法、证书明文3客户端验证证书、取出服务器公钥—4客户端用公钥加密预主密钥并发送非对称加密5双方各自计算出相同的会话密钥—6客户端Finished消息使用会话密钥加密对称加密7服务器Finished消息使用会话密钥加密对称加密4.3 两问为什么需要三个随机数为什么HTTP/2和TLS 1.3握手更快你可能好奇为什么要用三个随机数来生成会话密钥而不是直接用其中一个原因是为了增加不可预测性。客户端的随机数可能不够“随机”服务器的也可能被预测但三个随机数混合之后即使其中一个被破解整个会话密钥也无法被轻易推算出。这是密码学里的老经验——引入多个独立随机源防止单一随机源被攻破。另外你可能听过HTTP/2和TLS 1.3“更快”。传统TLS握手需要来回两次两个RTT才能建立但TLS 1.3把握手压缩到了只需要一次往返客户端直接把支持的加密算法列表和猜测密钥发过去服务器收到后确认并生成会话密钥双方再确认一次就完成了。实际体验上HTTPS网站加载速度已经逼近甚至超过纯HTTP所以“HTTPS慢”这个观点在今天已经不太成立了。5. HTTP与HTTPS的实用对比端口、性能、成本以及“HTTPS一定安全吗”这个反直觉问题原理讲完了接下来进入实用环节。零基础读者学到这里肯定想知道我到底怎么判断一个网站用的是HTTP还是HTTPSHTTPS是不是一定安全上HTTPS要花多少钱5.1 最直观的对比维度我把HTTP和HTTPS的核心区别整理成一张对比表方便你看完直接记住对比维度HTTPHTTPS默认端口80443URL前缀http://https://是否加密明文TLS加密身份验证无有CA证书验证数据完整性无法保证传输中防篡改默认是否安全否是性能开销低略高但可接受证书成本不需要免费或每年数百至数千元关于端口多说一句。你可能遇到过https://example.com:8443/这种带端口的地址。端口相当于服务器上的“门牌号”80号门专门接HTTP请求443号门专门接HTTPS请求。如果网站把HTTPS服务跑在别的端口上就需要在URL里特别注明。5.2 HTTPS到底慢不慢一个真实的性能对比感受我自己的服务器做过一个小实验同一个静态页面分别用HTTP和HTTPS访问对比网络面板里的耗时数据。在不开启连接复用的情况下HTTPS首次请求要比HTTP多出1-2个RTT的握手时间在延迟较高的网络上差距会比较明显。但现代浏览器默认开启连接复用而且HTTP/2强制要求使用HTTPS加上TLS 1.3把握手压缩到一次往返实际体感差距已经很小。如果你的网站页面本身要加载几十个资源每个资源都走同样的HTTPS通道复用握手成本被摊薄差距就更微乎其微了。真正要关注的性能开销是服务器端的CPU——TLS加密解密会消耗CPU资源。但现在的服务器CPU处理AES加密非常快对于中小流量网站来说完全不是瓶颈。5.3 证书从哪里来免费的Lets Encrypt就够用还有一个大家普遍关心的问题证书要花钱吗答案是可以一分钱不花。Lets Encrypt提供了免费的数字证书而且支持自动续期。我自己管理的小网站都用它配置好自动续期脚本之后完全不用手动干预。类似的服务还有阿里云、腾讯云的免费证书一般一年有效期到期重新申请。付费证书和免费证书的区别主要在于付费证书通常提供更长的有效期、更高的保险赔付额度、更完善的企业身份验证对银行、电商等对信任度要求极高的场景有额外价值。但对大多数个人网站、中小型企业站点来说免费的域名验证型证书DV证书已经足够了。5.4 反直觉的问题HTTPS不代表绝对安全这一点必须专门拿出来讲因为很多人有误解——以为网站地址栏带个小锁就万事大吉了。实际上HTTPS的安全边界非常有限它只保护“传输过程”保护不了传输两端。举几种常见的情况你访问了一个钓鱼网站这个网站自己也申请了正规的HTTPS证书那么浏览器也会显示小锁。HTTPS只能证明“和你通信的是这个域名的服务器”不能证明“这个服务器是好人”。你在HTTPS页面里输入了个人信息但网站服务器本身被入侵了数据库被拖走HTTPS也管不了。如果用户电脑本身中了木马键盘记录器监听输入内容HTTPS同样无能为力。另外还有一个开发中常遇到的“混合内容”问题页面本身是HTTPS但里引用的图片、脚本、样式来自一个HTTP地址。这种情况下浏览器会发出警告甚至直接拦截加载。我一开始写网页时踩过这个坑解决方式很简单把所有资源也改成HTTPS或者改成协议相对路径//example.com/xxx.js让浏览器自动选择当前页面使用的协议。所以对HTTPS的正确理解是它保证了从你电脑到服务器这段网线/无线信道上的内容安全但安全链条两端的任何一环出了纰漏HTTPS都救不了。6. 实际开发中绕不开的坑抓包工具、502、混合内容以及我的排查经验原理和实践之间总是隔着好几个坑。这一节我把做开发以来遇到的、和HTTP/HTTPS直接相关的真实问题列出来尤其是零基础读者容易懵的地方。6.1 Jmeter录制HTTPS脚本为什么总失败做接口测试的朋友一定遇到过这个问题用Jmeter录制脚本访问HTTPS网站时录不到内容或者直接报SSL相关错误。原因是Jmeter作为一个客户端在发起HTTPS请求时也需要验证服务器证书。但服务器证书是CA签发的Jmeter使用的Java运行时默认信任一套根证书正常情况下应该没问题但很多内部系统用的是自签名证书或者公司内网环境里做了SSL解密代理这时候Jmeter就会因为不信任证书而拒绝连接。解决办法有两个方向方向一把服务器的证书导入Jmeter使用的JDK信任库。命令大致是keytool -import -alias yourdomain -keystore cacerts -file yourcert.cer导入后重启Jmeter。方向二如果是做性能测试不想纠结证书细节可以用Jmeter的HTTP取样器在“高级”选项卡里设置use preemptive authentication并导入客户端证书或者直接把请求协议改成HTTP跑通流程。但要注意这只适合测试环境生产环境必须用HTTPS验证真实效果。6.2 502 Bad Gateway和HTTP状态码到底是怎么回事热搜词里出现了“unexpected status 502 bad gateway: unknown error, url: http://127.0.0.1:1572”这也是新手经常在控制台里看到的东西。502是HTTP协议里定义的一个状态码全称是Bad Gateway意思是网关或代理服务器收到了上游服务器返回的无效响应。举个例子你的请求先到达Nginx反向代理Nginx再把请求转发给后端的应用服务器比如Java进程、Python进程。如果后端应用崩了、响应超时或者干脆没在对应的端口上监听Nginx就会返回502。排查502的思路我一般这么走先确认后端服务本身是否存活ps aux | grep java或者直接访问后端地址看看有没有响应再看Nginx错误日志tail -f /var/log/nginx/error.log看具体的连接失败原因和时间点如果后端是PHP-FPM之类的还要查一下进程池是否被占满常见原因是pm.max_children配小了。502本身和HTTP、HTTPS的区别没有直接关系但理解状态码体系是排查网络问题的基本功。HTTP状态码按首位数字分成五类1xx是信息2xx是成功3xx是重定向4xx是客户端错误5xx是服务器错误。你看到4xx开头的优先检查自己这边是不是发错了看到5xx开头的再去折腾服务器。6.3 我踩过最典型的坑本地开发用HTTP上生产忘换HTTPS还有一个非常经典的坑我估计很多同行都经历过本地开发环境图省事全部用HTTP代码里写死了接口地址比如http://localhost:8080/api部署到生产时忘了改结果生产页面是HTTPS浏览器因为“混合内容”把HTTP接口全拦截了。我们查了半天最终在浏览器控制台看到一行提示was loaded over an insecure connection. This file should be served over HTTP。意思是某个资源本来该用HTTPS结果用了HTTP加载浏览器不给执行。这个问题的解决办法是建立一套规范代码里的接口地址永远用相对路径或协议相对路径不要写死http://或https://前后端分离的项目用环境变量区分开发、测试、生产的接口地址上线前在浏览器开发者工具里全局搜一下http://把所有明文引用都揪出来。6.4 关于自签名证书的一个实用建议如果你在开发环境需要配置HTTPS但不想每次都拿“证书无效”警告顶上去有两个小技巧本地开发用mkcert工具生成受本机信任的证书。它会往系统信任库里导入一个本地CA之后生成的所有证书都是“可信”的浏览器不再报警。实测非常好用开发体验提升明显。配置Nginx时指定证书文件路径注意证书和私钥不要搞反很多坑都是PEM格式和KEY文件路径配错造成的。server { listen 443 ssl; server_name example.com; ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; location / { proxy_pass http://127.0.0.1:8080; } }上面这段是Nginx里配置HTTPS反向代理的基础模板。listen 443 ssl表示在443端口监听HTTPSssl_certificate指定证书文件ssl_certificate_key指定私钥文件。proxy_pass的作用是把HTTPS请求转发给内网HTTP服务——这也是实际生产中最常见的架构外层用Nginx终结TLS内部服务走HTTP通信既保证了外部安全又降低了内部改造成本。6.5 用OpenSSL快速自查网站证书最后分享一个零基础也能用的工具命令。如果你想看看某个网站用的HTTPS证书是谁签发的、什么时候过期可以用OpenSSL直接连上去查openssl s_client -connect www.example.com:443 -servername www.example.com命令执行后输出中会有一段Certificate chain和Server certificate信息能看到证书的签发者Issuer、持有者Subject、有效期Not Before/Not After。排查证书过期、链路不完整、域名不匹配这类问题时这一条命令比什么都快。有一次我的网站突然在浏览器里报证书错误就是用这条命令一查发现是证书链中间缺了一环重新配置了ssl_certificate的完整链后立刻恢复。这类问题其实特别常见——证书文件本身没问题但服务器只发了一张叶子证书没带上中间层的CA证书导致客户端验证链路不完整也会被判为不可信。记住这个思路以后遇到证书警告就不会慌了。
返回列表