网页上的那个蓝色锁头,实际上就是 SSL 证书,它看着挺唬人,但到底是如何把电脑和手机“骗”成是保险可信的?大量人当作只要看个证书弹窗就行,真复杂。
这玩意儿实际上是个双向的魔术猫,两边都得配合好,不然哪位信哪位信,哪位真哪位假。 KE 压路机,那是 SSL 握手的第一步,在一握手之前。浏览器直接扯个 SSL 证书,就像拿张假身份证去开门,门是开不上的。浏览器得先确认那个证书是不是合法的、是不是我的私钥,这叫做证书验签。服务器把证书发给浏览器,浏览器拿着公钥和私钥对撞,看看能不能对上。
要是对上,说明这个证书没过期、没被篡改,浏览器就放心了。
要是不对上,比如服务器改了公钥,浏览器立马就报警:“嘿,这个路不通!”这时候握手就废了,数据全废,交易直接卡死。 再往后,握手的过程就从好办的确认走到了真正的换数据。浏览器告诉服务器:“我要弄个会话,时候是 10 点,地点是 100 号门。”服务器收到,它得先算个数,确认这个工夫戳和地点是它自己“合法”的。
要是服务器告诉用户:“嘿,这工夫不对,你来得忒早了,要么地点不对”,浏览器立马回绝连接。 最要命的是中间人攻击,也就是所谓的“猫捉老鼠”。黑客在中间,想偷窃数据。
要是浏览器设了个“猫眼”,发现数据没加密就直接扔掉。
这时候,服务器得跟客户握手,并告诉客户:“嘿,你刚刚的猫眼坏了,数据是假的,重新来过。”客户收到提示后,就得重新发起握手。
要是中间人又坏,客户就彻底懵了,无法确认服务器是不是确实是服务器。 这就得靠一个叫 RSA 的算法来玩数字游戏。它俩得先握个手,换密钥。RSA 是个非对称加密,就像两个人用不同的钥匙开门。私钥是只有一个人有的,公钥是公开的。服务器用自己的私钥加密数据,再用自己的公钥发给浏览器;浏览器用自己的公钥验证签名,再用自己的私钥解密数据。
要是两边数据能对上,说明中间没坏,数据是保险的。 再想想数字签名的过程,这看起来像是对称的,实际上不然,它也是靠公钥和私钥来玩的。就像两个人互相给对方盖个章。服务器给浏览器盖个章,浏览器也给服务器盖个章。
要是服务器私钥没坏,浏览器公钥没坏,那章盖得就真。一旦私钥坏了,要么公钥造假,章就盖不住,浏览器立马识破。 还有握手里的同步难题,这得靠时钟。浏览器和服务器都得有个准的时钟,用来算工夫差。
要是服务器工夫比浏览器快了,浏览器可能会发现握手超时,要么算出毛病的工夫戳,直接报错:“嘿,你算的时钟仿佛比我慢,重新算!”有时候服务器就连得发个“时钟同步”的指令,告诉浏览器:“我的钟是 10:00:00,你的钟是 10:01:00,咱们得同步下。”这步做得不好,握手就卡壳,数据又乱套。 还有那个随机数,也是握手里的关键。浏览器要自己形成一个随机数,把这对数据给服务器,服务器收到后也要形成个随机数,把它给浏览器。
要是两个随机数不一样,服务器就知道:“嘿,这握手是伪造的,数据肯定是假的,直接回绝。” 实际上手写 SSL 证书这事儿早就不是新鲜事了。
那会儿有人专门写脚本,生成一个“自签名”的证书,这玩意儿骗过浏览器大量次,就连把整个互联网都骗那会儿了。
直到后来谷歌和苹果启动提要求,大家才启动收敛。目前大多数网站,要么银行、挂号,都用 CA 机构签的证书,这些证书有独立的验证流程,能查拿到颁发者是哪位,证书链是不是整个,是不是过期的。 不过话说回来,证书这东西最怕被黑客盯上。黑客能够随意找个合法的 CA,生成个证书,然后伪造,把别人的业务都骗那会儿。
这就得靠加密和数字签名来防,让黑客连证书本身都搞不定。 最终想想,为啥还要折腾如此多手续?出于数据一旦流走,哪位都能读。SSL 证书就是个“物理层”的保险承诺,它保证了数据是加密的,不是明文传给你。但浏览器得信任那个证书,服务器得信任那个私钥。信任链一旦断了,整个系统就瘫痪。HTTPS 的风云,实际上就是围绕着如何建立和维护这个信任链转的,从最早的握手,到目前的证书链,再到抗审查、防篡改,每一步都是攻防的博弈。