在互联网上,通信的整个过程可能要经历若干代理服务器、路由器和交换机等,如果使用http通信,那整个通信过程是透明的,任何代理服务器都能窃听并篡改通信内容,因此https应运而生。我们知道https是通过非对称加密和对称加密结合的方式实现三次握手的,在握手过程中使用非对称加密算法成功交换对称秘钥,后续的通讯过程就使用对称加密算法更快的通讯,同样握手过程和后续的每一个过程都会有若干窃听者,那TLS又是如何做到在这么多窃听者中实现对称秘钥交换的呢。
我们用最近很火的电视剧风声中的模拟这个通信过程,假如我们有如下角色:
李宁玉------我们的服务器
顾晓梦------客户端,会有很多个,而且具有不确定性
某大佐------通讯过程经历的代理服务器,也就是窃听者,坏人
中央情报机构------某CA
某天,晓梦给宁玉传递情报”老鳖已叛变“,如果使用http通信,无任何加密,情报被某大佐截获,这样某大佐可以根据情报内容对她们实施抓捕,甚至将晓梦的情报改成“老汉已叛变”,再转发至宁玉,这样后果不言而喻了。
但是作为数学天才的宁玉和晓梦,怎么会做这么冒险的事情呢,因此她俩合计,如果逃过某大佐的耳目。于是她俩还是讨论各自方案:
1. 握手过程中,宁玉给晓梦发送通信的密码,后续使用该密码加解密。
呜呜。。。这肯定不行,通信的每一个过程都会被某大佐截获,这样某大佐同样可以窃听或者篡改情报内容。
那怎么才能保证该密码不泄露呢,于是宁玉和晓梦想到了使用非对称加密算法,对该密码进行加密。
2. 握手过程中,宁玉先把自己的公钥发送给晓梦,当然,这一过程中,公钥肯定会被某大佐截获,你想截获就截获吧,你开心就好☺☺。晓梦收到公钥后,使用公钥对通信的密码加密,然后发送给宁玉,同样这个过程也会被大佐截获,大佐试图用上一步拦截的公钥解开密文,可是解不开,因为只有私钥能解开,而只有宁玉自己有私钥。宁玉收到加密后的密文后,用私钥解开,得到对称秘钥,成功完成对称秘钥交换,后续可以用这个对称秘钥进行通讯了,好开森☺☺,感觉这就是TLS安全通信的精髓了。
但是仔细一斟酌,宁玉和晓梦发现,这样的方案还是有漏洞,宁玉给晓梦发送公钥时,假如某大佐把公钥截获并据为己有,同时把自己的公钥给晓梦,晓梦收到公钥,对通讯的密码加密,此时她并不知道她用的公钥已不是宁玉给她的那一把,而是被某大佐替换掉的,某大佐截获到通讯内容后,用自己的私钥对通讯内容解密,并篡改其中的内容后,用上一步截获的宁玉的公钥进行加密,并转发给宁玉,宁玉并不知道收到的内容是某大佐篡改过的,失败,o(╥﹏╥)o。
那怎么才能保证晓梦收到的公钥是可信任的呢,于是宁玉和晓梦找到了中央情报机关。
3. 中央情报机关说:“宁玉,把你的公钥和身份信息给我吧,我来给你授权担保”,中英情报机关将公钥和李宁玉身份信息做成X509证书,并用自己的私钥对其加密,一起颁发给宁玉,并通知晓梦,到自己这里来领取的公钥都是可信任的。大家都对这个方案很满意,很开森(*^▽^*)。
为确保万无一失,中央情报机关、宁玉、晓梦开始反复斟酌,这样的加密方案是否还会有漏洞。
(1) 首先中央情报机关的公钥是公开的,谁都可以拿到,那这会不会有问题呢?
握手过程中,宁玉先把中央情报机关颁发的公钥证书发送给晓梦,当然这个过程某大佐会截获,并且某大佐完全可能拿到中央情报机关的公钥,对证书进行解密,以此来获得宁玉的公钥信息,以下再分两种情况:1. 假如某大佐不对内容进行篡改,直接转发给晓梦,后续晓梦收到后同样用中央情报机关的公钥解开证书,拿到宁玉的公钥后对秘钥进行加密,那某大佐再次截获也是没有用的,因为只有宁玉有自己的私钥可以解开;2. 假如某大佐试图将宁玉证书里面的公钥替换为自己的公钥,再重新加密送给晓梦,他也行不通,因为只有中央情报机关有私钥,能对宁玉的证书进行加密的也只有中央情报机关。这样只要晓梦保证自己手里的公钥证书都是中央情况机关颁发的可信任证书就可以了(*^▽^*)。
(2) 晓梦和宁玉是通过域名通讯的,会不会有人拿到宁玉的公钥证书,伪装宁玉。
这确实会存在问题,因为公钥证书本来就是公开的,为避免这种情况,宁玉与中央情报机关约定,中央情报机关定时通过域名访问宁玉,宁玉出示加密串证明自己没有被伪装。
ok,这样搞定,只要客户端的可信任证书列表都是正规的CA机构颁发的那就没有问题啦。