HTTPS流程简单介绍

来源:互联网 发布:淘宝汇吃入驻入口 编辑:程序博客网 时间:2024/06/13 01:50

        假如我们现在要登陆一个网站,输入用户名和密码并发送给服务器,验证通过之后才能登陆。很显然,用户名和密码在传输过程中不能被别人知道,要不就泄密了。所以,我们给在每一次和服务器建立连接的最开始,自己先随机定一个加密密码,称之为密钥,并把这个密钥给服务器,这样服务器和我们自己都知道了这个密钥,接下来,我们用这个密钥加密用户名和密码,这样,别人拦截到这个加密后的用户名和密码,他也看不懂,但是由于服务器也有密钥,因此服务器是可以解开这个信息的。

        有一个问题:这样做虽然能保证坏人看不懂这个密码,但是,如果他伪装成我们,把这个加密后的用户名和密码提供给服务器,服务器以为这就是我们自己,然后用我们的密钥解密,解密之后的信息依然是正确的,登陆验证还是会过,坏人依旧可以拿到我们的数据。要解开这个问题,有种方法,就是保证服务器能够识别出每个人的身份,不会用我们的密钥去解坏人提供的用户名和密码。但是这种方法无法实现,因为网络传输的模型是固定的,就像写信,无论怎么验证身份,给用户发“令牌”,坏人总可以拦截到最开始的那块“令牌”。

        因此这个方法不能考虑,我们换一种思维,就是让服务器不怕坏人伪装,即便服务器被骗了,给了坏人想要的数据,坏人也看不懂。想要实现这个方法并不难,只要让服务器把传回来的数据,也用刚才我们随机定的密钥加密就可以了。这样坏人虽然拿到了数据,可以他没有密钥,也没办法解密,依然看不懂这些服务器发回来的信息。

        但是,如果坏人拿到了我们的密钥,就可以解开这些信息了。而坏人如何拿到我们的密钥呢?由于我们是在和服务器通信的一开始,把密钥传给服务器的,如果坏人从这一步下手,就可以拦截到我们的密钥。

        因此,我们要把最开始传给服务器的密钥也加密,让坏人拦截到也看不懂,只有服务器能解开。如果解码方式由我们来定,我们就必须得把解码方式告诉服务器,要不虽然坏人解不了,但服务器也解不了。可是如果我们要把解码方式传给服务器,那就又留给坏人拦截的机会了。因此解码方式不能由我们来定,而要由服务器来定,而且服务器不能把解码方式告诉任何人,包括我们自己,因为服务器根本不能让解码方式出现在任何传输路线上,这样又会给坏人“劫道”的机会。

       但是服务器还是得告诉我们加密方式,要不然我们随意加密,服务器通过私有的解码方式也没法解。这时,就需要一种算法,让解码方式和加密方式是独立的,即便知道加密方式,也无法推导出解码方式。但是加密方式加密的数据,却只能用解码方式来解(https使用的的rsa算法,解码方式也可以用来加密,这时候用加密方式就可以解密!),无法通过逆向操作加密方式来解密。这样服务器就可以把加密方式告诉我们,不怕坏人拦截。

       这就是非对称加密。服务器有一个自己的解码方式,称之为私钥,服务器不会将私钥告诉任何人,不会让私钥出现在任何可能被“拦截”的路上。而传给我们的加密方式,称之为公钥(私钥加密公钥解,公钥加密私钥解)。在我们和服务器建立通信的最开始,服务器把公钥给我们;然后我们再随机生成一个密钥,这个密钥是用来对称加密的(也就是说,用这个密钥加密的数据用这个密钥就可以解);之后,我们用公钥把随机密钥加密,传给服务器,服务器通过私钥来解密,得到我们的随机密钥并保存。再之后的通信数据,都用随机密钥来加密。

        这样一来,坏人拦截到我们传给服务器的随机密钥,由于拦截到的随机密钥是加密的,坏人根本不能用;他想解密得到真正的随机密钥,也无法做到---因为解密需要私钥,而私钥在服务器严密看管,除了服务器没人知道  。因此坏人无法得到真正的随机密钥,这样即使拦截到用户名和密码,坏人不仅看不懂;而且冒充我们的身份把用户名和密码发给服务器之后,骗过了服务器得到用户数据,这些用户数据由于坏人没有随机密钥也没法看懂。

       但是还有一个问题,就是我们第一次跟服务器发请求的时候,如果坏人拦截到了,并冒充服务器,用他自己的私钥发给我们,我们就会误认为坏人是真正的服务器,从而用坏人的公钥来加密我们生成的随机密钥,坏人再拦截一次,拦截到我们发送的加密后的随机密钥,就能破解,因为我们是用坏人的私钥加密的,坏人用自己的公钥即可解密。

       因此,我们必须要保证第一次收到的私钥必须是服务器本人的私钥。所以我们就要求,服务器要发来一个证明“发送者是本人”的证书,证书里包含公钥。我们收到证书后,再去验证证书的合法性。

       但是这又带来一个问题,那就是怎么验证证书呢?如果坏人拦截到证书,把证书里面的公钥替换成自己的公钥,我们能么验证出来这是一个非法证书呢?有个解决办法,那就时把证书里面的信息都加密了。那下面的问题就是,用什么样的密钥加密呢?对称类型的密钥肯定不行,因为对称加密的密钥必须用非对称加密的方式来传输,但是现在我们还不知道非对称加密的公钥;那用服务器的公钥加密?不可能,因为我们不可能会知道私钥;那用服务器的私钥加密?可以,我们用服务器的公钥就可以解。但是我们现在需要的就是公钥啊!我们现在请求的就是公钥,包含公钥信息的证书还必须用公钥解,那是一个无法跳出的循环啊!

       因此服务器加密的证书,根本就不能让服务器自己加密;实际上,服务器的证书,是向合法的CA(Certification Authority,证书颁发机构)买来的,买的时候,先告诉CA自己的公钥,以及其他的基本信息,如姓名、公司、地址、证书有效期等。CA把这些信息连同CA自己的证书,用CA自己的私钥加密,然后发给买证书的公司。

       而和我们通信的服务器,它的证书就是从CA那里买来的。一般浏览器内置了几个拥有根证书的权威CA的公钥,当浏览器收到服务器发来的证书后,浏览器会根据证书上写的CA,来找到自己内置CA对应的公钥,用这个公钥就可以解开证书的信息(因为证书是用CA的私钥加密的)。而坏人如果拦截到服务器发来的证书后,由于这个证书浏览器会用对应的CA的公钥解码,这就要求坏人要修改证书信息,必须修改完了再用CA私钥加密,但是CA的私钥又不可能得到,因此坏人就无法修改证书信息,这样浏览器得到的一定是原本的证书,因此公钥也就是真正服务器来的公钥,而不是坏人的公钥,因此之后的通信,坏人无法破解。

0 0
原创粉丝点击