一篇文章讲清SSL/TLS与数字证书的原理
在开始这篇文章之前,我们先讲一个非常常见的场景:Alice想要登陆到某银行的网上银行系统进行转账操作。显然,她需要在网银界面上输入卡号和密码,就像在ATM机上转账需要插卡并输入密码一样。但是,她突然想到一个问题:卡号和密码真的会被安全地发送到银行那里吗?也就是说,会有人窃听到卡号和密码吗?
她知道最常见的HTTP协议是明文协议,如果使用这种协议通信的话,任何处于Alice和网上银行之间的网络中间人都能够窃听到他们之间通信的一切内容。这时,她看了看浏览器的地址栏,上面显示着一把小锁🔒,并且网址显示着https的字样,这时她放下心来了:她和网上银行之间的一切通信都是安全的,也即满足了以下三个条件:
1、没人能知道Alice和网上银行之间的通信明文内容。网络中间人只能看到一堆无意义的密文。
2、Alice的确是在和网上银行通信,而不是和其他人通信,导致卡号和密码泄漏给其他人。
3、没人篡改了Alice和网上银行之间的通信内容。
那么如此神奇的HTTPS协议是怎么做到这些的呢?其实,HTTPS可以简单地理解为应用了SSL/TLS协议的HTTP协议。对于HTTP我们没什么可说的,这是一个明文的应用层协议,因此我们要重点了解SSL/TLS协议的原理是什么。
从目的来看,SSL/TLS的设计就是要做到任意两点之间实现满足上文所述三点的加密通信。SSL/TLS同时使用了对称密码学和非对称密码学。对称密码学指的是加密和解密需要使用同一密钥的密码学。
我们生活中,对汽车、门上锁和解锁就好似对称密码学中的加密和解密,汽车钥匙、门钥匙是对称密钥,上锁就像是加密,解锁就像是解密。对称密码学的加解密速度比非对称密码学要快,但缺点是一旦对称密钥被泄漏给别人,别人就能解密所有加密过的数据,所以密钥不能随意传播和公开。就好像如果你丢了汽车钥匙,车就有可能被人解锁并开走。
而非对称密码学则不同,应用非对称密码学可以一下子生成两把在数学上有关联的钥匙:公钥和私钥。与对称密码学不同的是,用公钥加密的数据只有用私钥才能解开,用私钥加密的数据只有用公钥才能解开。想象一下你有公钥、私钥和一辆汽车,当你用公钥给汽车上锁后即使把钥匙留在锁孔上不拔下来也不怕人偷车,因为只有私钥才能解锁,是不是很神奇呢?但非对称密码学并不是银弹,缺点是速度比对称密码学慢上许多。
回到刚才的问题:如何在任意两点之间实现满足上文所述三点的加密通信。你可能很快就会想到,没有那么复杂嘛!如果Alice想向银行发送卡号和密码,可以先问银行要一把对称密钥,然后Alice用对称密钥给卡号和密码加密,发送给银行,这样卡号和密码就不会被网络中间者看到了,Voilà!
但生活比你想象的要艰难得多。为了截获Alice的银行卡号和密码,网络中间人可以在银行发送对称密钥A给Alice的时候将对称密钥A替换成网络中间人自己的对称密钥B,这样Alice就会用对称密钥B给卡号和密码加密并发送,这时网络中间人再用对称密钥B解密Alice发来的数据就可以获得Alice的卡号和密码。
你可能会说,试试看非对称密码学?如果Alice想向银行发送卡号和密码,可以先问银行要来银行的公钥,然后Alice用公钥给卡号和密码加密,发送给银行,然后银行用银行的私钥解密数据得到Alice正确的卡号和密码。不幸的是,答案是一样的,Alice的卡号和密码仍然会被泄漏。
为了截获Alice的银行卡号和密码,网络中间人可以自行生成一对公钥和私钥B,在银行发送银行公钥A给Alice的时候将银行公钥A替换成网络中间人自己的公钥B,这样Alice就会用公钥B给卡号和密码加密并发送,这时网络中间人再用与公钥B相关联的私钥B解密Alice发来的数据就可以获得Alice的卡号和密码。更糟糕的是,由于使用了非对称密码学,速度还比使用对称密码学下降了不少。
为了解决如上问题,我们现在引入数字证书的概念。如上的问题之所以会发生,是因为Alice不知道到底银行的真实密钥是什么,她收到的密钥可能并不属于银行。那么你可能会问,如果在Alice去银行的时候,银行当面告诉Alice该用什么对称密钥或非对称密钥通信,不就可以了嘛?这么做虽然是可行的,但别忘记SSL/TLS的设计目的:在任意两点之间实现满足上文所述三点的加密通信。在浏览任意网站之前都需要线下交换密钥,是一件几乎不可行的事情。
为了实现不用线下交换密钥就能加密通信,人们设立了证书机构(Certificate Authority,简称CA)。证书机构有自己的公钥和私钥。银行首先准备好未签名过的数字证书,即【银行的公钥,银行的名字】。然后,银行到证书机构那里办个手续,即出示自己的营业执照和数字证书,然后证书机构就用自己的私钥给【银行的公钥,银行的名字】进行hash后进行加密,得到“数字证书的签名”。同时,Alice的电脑上需要准备好CA的公钥。以后每次Alice访问网上银行时,银行将数字证书和“数字证书的签名”发送给Alice。
Alice用CA的公钥解密数字证书的签名得到hash值,再亲自将数字证书的明文进行hash,如果这两个hash匹配,则确认数字证书的真实性,进而Alice就可以放心地用银行的公钥加密卡号和密码了。为什么?因为网络中间人没有CA的私钥,无法伪造CA颁发的“数字证书的签名”。
如果网络中间人自己生成一对公钥私钥C,并用私钥C给【公钥B(见上文),银行的名字】的hash进行加密,生成假的数字证书,那么Alice用CA的公钥解密数字证书的签名时将得到一堆无意义的hash值,根本不能和【公钥B(见上文),银行的名字】的hash值进行匹配,就可以知道数字证书是伪造的了。
好了,不知不觉我们已经解决了上文所述三点中的第一和第二点,不过由于采用了非对称加密,导致速度变慢。如果Alice和银行之间有许多数据需要传送,会消耗很多时间在加密解密上。我们可以这么解决:当Alice接受到银行的证书也即银行的公钥后,生成临时的对称密钥D,用银行的公钥加密对称密钥D后传送给银行,再将卡号和密码用对称密钥加密后传送给银行。
银行用银行的私钥解密密文得到对称密钥D,再用对称密钥D解密密文得到卡号和密码。这样就能实现用对称密码学快速加密解密。事实上,SSL/TLS就是这么做的。
好了,SSL/TLS的大部分内容都已经讲解完了,不过我们还没解决上文中的第三点。相信能读到这里的读者已经不多了,限于篇幅,我们不再介绍如何解决第三点。如果感兴趣,可以去搜索“消息完整性验证”进行了解。
- End -
往期热门资讯:
公众号ID:ikanxue
官方微博:看雪安全
商务合作:wsc@kanxue.com