为什么可以相信一个 HTTPS 网站?
摘要、签名、证书、信任链:信用不是数学算出来的
目录
前言
先说清一件事:
加密和解密解决的只是传输链路的安全问题,相当于两个人说话不被别人偷听。但信用是另一回事。
看几个身边的例子:货币的信用由政府支撑;购房贷款的信用由银行支撑;你愿意买某个视频网站的会员,是因为相信这家公司的信誉;连比特币的信用,也要靠知名人士不断喊话。
一句话点题:信用源于我们的世界。信用的背后不是数学和算法,而是人,以及围绕人形成的组织、机构、国家。
那么回到那个很小的问题:你上网时,凭什么相信你访问的网站没有骗你?这一篇就从 HTTPS 的信用角度,把互联网的信用体系捋一遍。
一、摘要:给内容按个「指纹」
现实中要证明一份合同没被改过,人们会盖齐缝章、附上签名。签名和盖章是一个意思:证明自己签过某份协议,并且签完就不能再变。
想阻止合同被改,最容易想到的办法是加密:一旦加密,要改就得原文和密文一起改。这没解决「谁来提供信用」这个根本问题,但至少解决了一个基础问题——想改的人必须先拿到密钥。
1.1 为什么不用加密,而用摘要
加密的计算量大,而且结果通常比原文还大。
于是有个更轻的办法:摘要算法。摘要这个词和现实中的「文章摘要」是一个意思——给文章生成一个提要。只不过计算机算出来的不是概括总结,而是一个大数字。
给计算机一篇文章,用摘要算法(主要是哈希类算法)生成一个字符串。内容只要变一个字、甚至一个标点,摘要就会完全变样。
而摘要的体积很小,非常利于存储和传输。更关键的一点:对同一个摘要算法来说,不管你输入多大,输出的字节数是固定的。
以 MD5 为例:
md5(1字节数据)
md5(1M数据)
两行输入差了一百万倍,算出来都是 128 位 的值,换算成十六进制就是 16 个字符。哪怕拿它摘要一个 100M 的视频,结果还是 128 位——如果用加密算法,体积会随原文水涨船高。
1.2 摘要的价值:不可逆
摘要是对原文的证明,而且从原文到摘要不可逆。
原文能算出摘要,原文一变摘要就变;但拿着摘要想反推原文,几乎不可能。原因很简单:摘要和原文不是一对一——很多原文可以对应同一个摘要。
另外,想找到两份「摘要相同但原文不同」的内容(也就是摘要碰撞),概率低到像买彩票中大奖。所以实战中一般会挑碰撞难度更高的算法,比如 SHA-1。
1.3 一个真实用途:密码为什么不存原文
多数网站保存用户密码用的是摘要,而不是原文。原因很实际:程序员天天接触数据库,黑客也可能黑进数据库。存摘要,即使库被攻破,黑客拿到的也只是一串摘要。
拿到摘要什么也干不了——反推不出密码原文,也就登不进这个网站。但如果黑客能找到一份和密码摘要相同的原文呢?那他就能正常登录了。这正是摘要碰撞危险的地方,好在目前主流算法足够安全。
小结一下,摘要算法解决了三件事:
- 为原文生成固定长度的内容证明(内容摘要);
- 无法逆向得到原文,看起来是乱的,拿到了也没用;
- 极低概率碰撞,不同内容几乎必然生成不同摘要。
但要记住:摘要只是一个工具。它能用在很多地方(比如密码存储),对互联网信用体系来说,它也只是基础件。
二、签名:在摘要上盖个私章
摘要的另一大用途是签名。还是用张三、李四签合同的例子。
张三先把合同生成摘要,再用自己的私钥加密这个摘要,得到一串密文——这串密文就是张三对合同的数字签名(Digital Sign)。
然后张三把公钥、合同原文、数字签名一起交给李四保管。效果基本等同于今天双方交换合同。
可以这样理解:数字签名就是对摘要的加密,所以它天生带着摘要的能力。
如果原文没被改过,下面这串等式就成立:
公钥解密(数字签名)== 签订时的原文摘要
== 摘要算法(当前原文)== 当前摘要
如果原文被改了,那就重新算一次摘要,和解密出来的「老摘要」一对比,立刻露馅。对张三而言,李四没有他的私钥,改不了他签过名的合同;对李四而言,张三也没法抵赖
因为李四拿张三的公钥一解,能解开就说明是张三的私钥签的。这一招同时解决了「防篡改」和「防抵赖」。
2.1 三层工具的分工
| 层次 | 解决什么问题 | 生活里的对应物 |
| 摘要 | 证明内容没被改过,且体积小、好传输 | 文章的提要;合同上的齐缝章 |
| 签名 | 证明「谁」签的,且签完不能改 | 本人在合同上签字 |
| 证书 | 证明这把公钥确实属于这个人/这个域名 | 公安局发的身份证 |
三、证书:谁来证明这把公钥是你的
不过上面那个例子有个致命缺陷:张三和李四的公钥,凭什么有公信力?
这里用了技术手段,你也可以理解成数学方法。但信用本身不能靠数学解决。真正的缺口是:谁来证明张三给李四的公钥确实是张三的?谁又来证明张三、李四是有权签约的合法个人?
3.1 信用必须有人提供
信用必须有人提供。
现实中只有权威机构(比如公安局)能证明张三是张三。互联网世界同理:需要专门机构提供证书,由它证明「这把公钥属于这个域名」。
这不代表张三不能自己给自己做证书——技术上当然可以,因为加密、签名算法都是公开的。只不过张三自制的证书没有公信力。差别不在算法,而在背后有没有信用。
3.2 一张证书里有什么
证书是一份身份证明文件,互联网上最常见的是给域名做证书。基础信息通常包括:
- 覆盖的域名;
- 证书的用途;
- 签发时间;
- 到期时间;
- 域名方的公钥;
- 等等。
除了证明身份,证书还有个关键作用:让别人能用你的公钥。
比如你自己签名的数据,别人就能拿你证书里的公钥去解密对照。这些信息本质上都是文本,最重要的是必须有权威机构对整张证书签名。CA 用自己的私钥签一下,于是证书上还要多三项:
- 权威机构的名称;
- 权威机构的签名;
- 权威机构的网址。
最后这一步签名,就像护照上盖的那枚章。有了它,证书才算合法。
四、信任链:一级一级往上问
现在问题来了。李四拿到张三的证书,看到上面有个权威机构的签名,第一反应必然是——这签名真是那个权威机构的吗?
换成你打开一个 HTTPS 网站也一样:你被告知这证书是 GlobalSign 签发的。可大多数人都没听过 GlobalSign。不知道也没关系——用户根本不需要理解它,底层机制已经替你解决了这个问题,这就是信任链。
4.1 浏览器验证的实际步骤
用 HTTPS 打开一个页面时,证书会随握手被下载到本地。浏览器打开它,发现签发方是 GlobalSign(一家证书颁发机构,CA)。
- 浏览器去操作系统里查:有没有装 GlobalSign 的证书。装了,就信。
- 为什么可以信?因为操作系统的提供商——微软、苹果、谷歌——总不会为了砸自己招牌而恶意装非法证书。
- 既然本机有 GlobalSign 的证书,那么 GlobalSign 的公钥就应该能解开网站证书上的签名,得到网站证书的摘要,于是这张签发证书可被信任。
- 如果系统里没装,浏览器就去 GlobalSign 官网下载它的证书。
- 拿到之后仍不确定它权威,那就继续看这张证书上有没有签发方;有就递归往上查,直到查到一张「没有别人给它签名」的证书——根证书。
只要操作系统里有根证书,GlobalSign 就值得信任,于是它签发的那张网站证书也值得信任。
4.2 根证书凭什么特别
操作系统的提供商在这里扮演关键角色。系统安装时会预装一批证书,这些就是根证书;能签发根证书的机构叫根证书提供商。
全球范围内这类机构极少,只有信誉极好的机构才担得起。成为根证书提供商要过很多资质审核,出问题会被取消资格,还得和微软、苹果、谷歌等多家操作系统厂商达成合作。
4.3 三层链条
层层证明,最终构成一条信任链。通常分三层:
| 层级 | 证书由谁签名 | 装在哪里 |
| 根证书(Root CA) | 自签名 | 随操作系统预装;少数情况由用户手动装(如抓包工具) |
| 中间证书机构 | 由 Root CA 签名 | 按需从网上取,浏览器逐级核验 |
| 终端证书(如网站) | 由中间证书机构签名 | 随 HTTPS 握手下发到本地浏览器 |
根证书自签名,中间证书由根签,终端证书由中间签,这就是信任链的形态。它也顺带抬高了犯罪成本:想冒充证书,就得让中间机构签你;要签就得买证书;而且买来的证书只能用于你自己的域名,冒充不了别人的网站。
要特别警惕一种情况:如果犯罪分子设法在你的电脑上装了它的根证书,后果极其严重——它可以冒充任何网站。所以抓包工具要求你手动装根证书时,务必想清楚这台机器上有什么。
五、总结
解决信用不是一个数学问题。
塑造信用靠的是社会关系——基于社交关系的信用、基于国家机器的信用、基于公司信誉的信用。但工具同样不可少,三者是这样搭起来的:
- 摘要,是数学意义上的证明:体积小、没有密钥管理和分发问题,非常适合网络环境。
- 在摘要上用私钥加密,就是签名;签名能防篡改、防伪造、防抵赖。
- 在摘要和签名之上,引入现实中已有的社会关系,让信誉良好的机构提供信用——这就是证书颁发与信任链体系。
为什么可以相信一个 HTTPS 网站?
答:用浏览器打开 HTTPS 网站时,会先下载该网站的证书;浏览器验证证书上的签名,并一级一级往上验证,直到根证书。如果根证书已被预装,就会信任这个网站。也就是说,网站的信用是由操作系统的提供商、根证书机构和中间证书机构共同担保的。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)