资讯动态

HTTPS加密原理:对称加密、非对称加密与证书如何协同工作

发布时间:2026/10/25 5:30:32 来源:尧图企业网站定制
1. 先认识这场大戏的三位主角对称加密、非对称加密、证书每天打开浏览器访问某个网站地址栏里那个小锁图标你估计已经看腻了。但你有没有想过这背后到底发生了什么为什么同样是加密银行网站和自家测试服务器呈现的状态完全不同HTTPS真正在做的事情其实是一场三个角色配合完成的加密大戏对称加密、非对称加密、证书体系。把这三个角色搞明白HTTPS的加密过程你已经理解了一半。1.1 对称加密一把钥匙开一把锁快但有个致命前提先讲最简单的。所谓对称加密就是发送方和接收方用同一把密钥来加密和解密数据。就像你家里装了一把锁你和家人手里各有一把完全相同的钥匙进出门都用同一把。常见的对称加密算法有AES、ChaCha20速度非常快适合加密大流量的数据比如视频画面、文件传输、接口响应体。但这里有个致命的问题这把共同的钥匙怎么交给对方如果你通过互联网把钥匙明文发给对方中途任何一个人截获了这把钥匙后续的加密就全部报废。这就像你为了给朋友送一个保险箱却把保险箱的钥匙放在了快递盒子里一起寄出去只要物流环节有人拆开看了一眼保险箱的保护就形同虚设。HTTPS从头到尾都没有只依赖对称加密正是因为这一步没法安全完成。1.2 非对称加密公开投递箱安全但慢得让人着急非对称加密的思路完全不同。它生成一对密钥公钥和私钥。公钥可以公开给任何人私钥只有自己保存。用公钥加密的数据只有配对的私钥能解开反过来用私钥签名的内容大家用公钥就能验证是谁发出的。这就像你在楼下放了一个带投递口的邮箱任何人都能把信件投进去但只有你手里有打开邮箱的钥匙。公钥就是那个邮箱本身谁都能往里放东西私钥就是你手里的开箱钥匙。非对称加密解决了对称加密“钥匙怎么安全送达”的问题。但是它慢非常慢。RSA算法和椭圆曲线算法在处理同样数据时速度比AES慢了几个数量级。你可以把对称加密想象成一辆装满货的重卡非对称加密则是手推车效率差距巨大。所以现实中不会有人用非对称加密去加密整个网页内容那样网页加载会慢到让人崩溃。1.3 证书体系给服务器办一张“官方身份证”现在还剩最后一个问题就算服务器把公钥发给我我怎么确定这个公钥真的属于我访问的那个网站中间人完全可以伪装成服务器塞给我一个假公钥。于是我拿着假公钥加密数据中间人再用自己的私钥解密信息照样泄露。证书体系就是用来解决“公钥到底是不是本人的”这个问题。服务器在部署HTTPS之前会向一个受信任的第三方机构申请数字证书证书里包含服务器的域名、公钥、有效期最关键的是有机构用自己私钥做的签名。浏览器收到证书后只要验证这个签名有效就等同于确认了“这个公钥确实属于这个域名”。这一步可以理解为非对称加密保证了箱子只有服务器能打开而证书保证了箱子真的是服务器寄来的不是冒牌货。三者缺一不可。2. 三分钟看懂HTTPS握手全流程把这三位主角的职责搞清楚之后真正精彩的部分来了它们是怎么配合的这个过程有一个专门的名字叫TLS握手。整个过程通常在几百毫秒内完成对用户来说完全无感但网络报文里发生的事情比你想象中丰富得多。2.1 第一步打招呼——协商能力你访问一个HTTPS网站时浏览器会先发出一个ClientHello报文。这个报文里带了你支持的TLS版本列表、加密套件列表、以及一个随机数。加密套件可以理解成“双方愿意用哪套算法组合”比如密钥交换用ECDHE、身份验证用RSA、对称加密用AES256-GCM这些都会打包成一组组选项。服务器收到之后从自己的配置里挑一套双方都支持的组合回一个ServerHello报文。这里也会带上服务器生成的另一个随机数。此时双方已经定好了“用什么语言对话”但还缺一个关键的东西握手密钥。这两个随机数一会儿会参与密钥计算保证每次会话的密钥都不一样。打个比方这一步就像两个人打电话先确认对方讲中文还是英文、加密软件用哪个版本。如果协商失败比如浏览器只支持TLS 1.3服务器还停留在TLS 1.0握手就断了。这也是很多老旧系统访问新网站时白屏加报错的原因。2.2 第二步亮身份证——证书校验协商结束后服务器会把证书链发给浏览器。证书链从服务器证书开始往上到中间证书再到根证书。浏览器做的事情本质上是沿着证书链逐级验证签名确认最顶层的根证书在自己的受信任列表里。这一步还有一个容易被忽略的细节证书里的域名必须和浏览器地址栏里的域名完全一致。所以你看到证书报错时往往有两种情况要么证书过期了要么证书签给另一个域名。两者都是致命的。证书验证通过后浏览器就拿到了服务器的公钥接下来可以安全地发送秘密信息了。2.3 第三步交换“暗号钥匙”——密钥协商拿到公钥之后浏览器生成一个预主密钥用服务器的公钥加密发给服务器。服务器用自己的私钥解开这下双方各自有了三个材料双方之前交换的随机数、预主密钥。把这三个材料丢进一个伪随机函数里运算就能得到最终的会话密钥。这里有个很微妙的设计会话密钥虽然是通过公钥加密传输的但它是随机生成的而且只服务这一次会话。哪怕攻击者记录了所有密文流量拿到了服务器私钥也只能解开当年的那一次会话无法回溯解密以前的通信。这就是前向保密。现代TLS 1.3标配的ECDHE密钥交换就是干这个用的。用生活类比来理解服务器在门口放了一个密码箱的锁浏览器把密码纸塞进箱子寄过去服务器打开箱子拿出密码纸。之后双方用这张密码纸上的密码锁住所有对话旁人即使看到箱子里的密文也根本没有密码纸。这套流程的设计意图非常清晰公钥加密只用来保护一小段最核心的秘密后续海量数据交给高效的对称加密。2.4 第四步进入正题——对称加密通信预主密钥交换完成后双方各自算出会话密钥然后互发一个Finished报文确认“我这边一切就绪我开始用新钥匙了”。往后所有的HTTP报文都通过对称加密传输包括请求头、Cookie、POST表单、响应体全部加密。这一步其实才是HTTPS数据保护的主战场。握手阶段只是把身份和钥匙的问题解决掉真正业务数据量最大的部分——图片、接口数据、页面HTML——全部由对称加密负责。所以TLS握手完成后性能开销主要取决于对称加密算法的运算速度和连接复用情况。实测下来配置了TLS 1.3并且开启会话恢复的站点握手可以压缩到一次往返体感上甚至比未加密的HTTP没有明显差距。至此三分钟已经讲完了全流程。你大概能回答这几个问题HTTPS用了哪些算法为什么需要证书会话密钥是怎么算出来的如果这些你还能答上来说明你已经超过了绝大多数只会点锁图标的用户。3. 那些容易被忽略的关键细节握手流程讲完之后很多人会产生一种错觉HTTPS等于绝对安全。这个想法相当危险。HTTPS保护的是传输过程的机密性和完整性但它不能保证服务器本身不被入侵也不能保证你访问的网站一定不是钓鱼网站。更准确地说HTTPS解决的是信使会不会偷看信件的问题而不是信件内容是否真实可信的问题。3.1 为什么浏览器说它安全而不是“绝对无法破解”浏览器地址栏里的锁图标严格来说只代表“从你的电脑到这个服务器之间的链路是加密的”。证书也不过是证明“你正在和这台服务器对话”。如果服务器的代码有漏洞、数据库被拖库、后台被植入后门HTTPS一点忙都帮不上。我见过不少团队为了过等保或者合规要求把HTTP改成HTTPS就以为万事大吉结果接口鉴权漏洞照样被扫穿。加锁和加保险是两回事。再补一个容易误解的点HTTPS只是把传输内容加密了URL路径、域名本身在DNS解析和TLS握手时仍然会被观测到。你在什么时间访问了哪个网址连接了哪个IP对于能监控网络出口的人来说仍然可见。想通过HTTPS达到“网络隐身”的效果那是不可能的。3.2 中间人攻击HTTPS到底在防谁中间人攻击是HTTPS需要解决的核心威胁模型。攻击者伪装成你访问的网站拦截并转发请求。如果没有证书校验攻击者完全可以自己生成一对密钥把公钥发给浏览器同时用自建服务器跟你说话再用正规服务器跟网站说话两边都能解密看到明文。证书体系就是彻底阻断这条路的攻击者的证书没有可信的CA签名浏览器会给出不可信警告。这也是为什么自签名证书在内部测试环境下能用但在公网环境下只会被浏览器拦截。你可能会问那如果是公司内网部署了私有CA呢这种情况在大型企业内部很常见。IT管理员把企业内部CA加入所有电脑的受信任根证书列表然后内网系统全部用这个CA签发HTTPS证书。这种做法本身没问题但有一个极大的隐患如果企业CA的私钥泄露攻击者就能给任意域名签发合法证书浏览器会完全信任。这就是为什么CA私钥的管理是所有安全体系里最敏感的部分。3.3 TLS版本与加密套件配置不对照样有洞HTTPS的加密强度取决于你启用的TLS版本和加密套件组合。这么多年下来SSLv3、TLS 1.0以及TLS 1.1都已经被证明有严重的安全问题。如果你的服务器还在用这些老旧的协议版本攻击者可以降级攻击强行把连接降级到弱加密然后破解会话密钥。我在实际配置里对一个内部系统的检查记录是这样的Nginx版本1.18最初配置文件沿用了几年前的模板里面同时开着TLSv1和TLSv1.1加密套件里还带着已经废弃的RC4。用工具一测安全等级直接打F。后来把所有旧协议关掉只保留TLSv1.2和TLSv1.3再把弱加密套件禁用安全评分才提上来。有一个通用建议可以分享直接参考主流云厂商和知名开源项目当前的推荐配置不要自己造轮子。你现在打开搜索工具找一份“当前推荐TLS配置”照着抄都比你手工组合强得多。配置项推荐值说明TLS 版本TLS 1.2 及以上TLS 1.2 为最低底线TLS 1.3 优先密钥交换算法ECDHE支持前向保密部分更安全对称加密算法AES-GCM / ChaCha20优先认证加密模式证书类型完整证书链含中间证书否则部分客户端不信任4. 实操验证与问题排查实录理论知识讲再多不如自己动手看一次。这个部分我分享几个我在实际排查HTTPS问题时反复用到的工具和套路非常适合初学者直接照着操练。尤其当你自己部署过HTTPS站点后这些东西的价值会体现得淋漓尽致。4.1 三分钟自查浏览器里看证书、命令行看握手先从最简单的说起。你在浏览器地址栏点击锁图标可以看到连接状态、证书详情。Chrome浏览器里还能看到证书的签发机构、有效期、域名匹配情况。如果证书有任何异常浏览器会在警告页明确告诉你原因。绝大多数客户反馈的“网站不安全”问题靠这个操作就能定位。命令行下最有用的工具是OpenSSL。如果你在服务端环境里想快速确认证书是否配置正确直接执行下面这条命令openssl s_client -connect 你的域名:443 -servername 你的域名这条命令会返回完整的握手信息服务器证书、证书链、加密套件、TLS版本。如果结果显示证书链不完整你会看到证书验证失败。后续再补一条命令把证书内容直接解析出来echo | openssl s_client -connect 你的域名:443 -servername 你的域名 2/dev/null | openssl x509 -noout -subject -issuer -dates这条命令能打印出证书的主体、签发者、有效期。我每次排查“证书过期”“证书链缺失”“域名不匹配”三类问题都用这一套命令搞定比打开任何在线检测工具都快。4.2 常见报错速查表我在处理各种HTTPS问题时把高频问题整理成了一个速查表。这个表格非常适合贴在自己的知识库里遇到问题直接对照。现象可能原因快速排查思路浏览器提示“证书过期”证书有效期已过查看证书dates字段及时续期提示“证书不受信任”证书链不完整或CA不是受信任CA确保证书包含中间证书用CA根证书校验提示“域名不匹配”证书签发的域名与实际访问域名不一致检查证书subject里的CN或SAN字段客户端无法完成握手系统TLS版本过低或双方算法不匹配看UserAgent确认客户端支持的TLS版本握手慢证书链过大、没有会话复用检查OCSP响应、启用session ticket其中“证书不受信任”出现频率最高。大多数时候不是CA本身有问题而是服务器配置证书时漏掉了中间证书。Nginx配置里如果你只填了服务器证书一个文件没有把中间证书拼在后面就会出现这个现象。解决办法是把中间证书内容追加到服务器证书文件后面也就是组成一个完整的证书链文件。4.3 我踩过的几个配置坑和解决思路第一次给一个内部系统上HTTPS时我犯过一个典型的错申请了证书也配好了证书文件但忘了把Nginx配置里的旧证书路径改掉。线上看起来一切正常因为Nginx启动时读的还是老证书文件直到某天证书过期才被客户发现。那次教训让我养成一个习惯每次部署HTTPS配置完成后必须用浏览器无痕窗口访问一次并且打开开发者工具看网络请求里的证书信息确认生效的是最新证书。还有一个坑是强制跳转。很多团队把HTTP自动跳转到HTTPS的规则写在Nginx里但因为没有考虑内网健康检查的请求导致健康检查请求也从HTTP跳到HTTPS最后被判定服务异常。后来我在跳转规则里加了一条白名单特定路径和内网IP段不跳转。这个坑在云环境部署时特别容易遇到对方往往会很疑惑明明curl http协议返回200为什么负载均衡检测就是不通过最后一个建议和证书续期相关。现在大多数免费证书的有效期只有三个月务必要把自动续期脚本配置好。我见过不少团队一开始手动续期后来嫌麻烦就放弃结果证书过期导致整个站点无法访问。自动化这个事情一定要在第一次部署时就顺手做完不要拖。我个人在经历过几次半夜被叫起来处理证书过期问题之后现在所有项目的证书监控都放进自动化脚本里每周检查一次有效期剩余天数不足三十天就自动提醒。这算是用惨痛经验换来的一个习惯。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑