HTTPS协议用于更严肃的场景,例如金钱交易。如果你在网上购物还用的是HTTP协议就有风险了,黑客很可能截获你的HTTP报文,然后伪造成商家骗取你的财富。解决这个问题的思路是加密。加密分为两种,一种是对称加密,一种是非对称加密。
对称加密中,加密和解密的密钥是相同的。非对称加密中,加密和解密使用的密钥是不同的,一把作为公开的公钥,另一把是谁也不能给的私钥。
对称加密
在网络上通信中,假如客户端和服务端都有对称密钥,客户端的密钥将信息加密发送出去,服务端接到消息用同样的密钥解密信息。服务端发送消息也是一样,信息经密钥加密后发送出去,客户端用同样的密钥解密。在网络中任何人截获数据包没有密钥也无法打开。
关键的问题在于,如何让客户端和服务端同样的对称密钥。这个问题用下面的非对称加密来解决。
非对称加密
私钥留给自己,公钥留给别人,我发的消息,有公钥的人都能看见,有公钥的人发的消息只有我能看见。但我只想给你看怎么办?
1、我用私钥加密信息,将消息和公钥发出去,你接到后,用我的公钥加密你要发的消息,消息中包含你的公钥。
2、我接到消息,且这个消息只能我接到,我将你的公钥拿出来,加密我想要给你发的消息。
3、我将这个消息发送出去,这个消息只有你的私钥才能解密。这样咱俩就能私密通信了。
数字证书
谁都可以生成私钥和公钥,将公钥发出去,来冒充商家骗取钱财。这时候如果有个像政府部门的机构来发个身份证就好了。数字证书就是互联网上的权威机构发行的身份证。
数字证书里有:公钥、证书所有者、发布机构、有效期。
这个数字证书的颁发机构我们称为 CA(Certificate Authority)。具体操作是用命令发起一个证书请求,然后权威机构会给这个证书卡一个章,我们称为签名算法。
签名的算法大致是这样的:将信息用hash算法计算出hash 值,这个过程不可逆。将这个Hash值用CA的私钥加密后和信息一起发出去。
权威机构又是怎么证明自己的呢?怎样防止别人冒充它的?
这还要靠非对称加密,权威机构用自己的私钥给网站的公钥加密,就相当于给网站做了证书。当客户与网站交易时,会获取网站的证书,只要得到权威机构CA 的公钥,就可以解密网站的证书签名,如果解密成功,里面的hash等信息能对得上,就说明这个网站的公钥没问题。
HTTPS 的工作模式
由于对称加密的效率要比非对称加密的高很多,当我们用非对称加密的密钥建立好信任之后,就可以用对称加密的密钥来通信了。HTTPS 协议就是这个思路。
双方建立的过程按客户端和服务端模拟,具体过程如下:
1、首先客户端给服务端发送 Client Hello 消息,并将自己支持的加密算法,以及一个随机数给服务端。
2、服务端收到消息后,选择一个加密算法,并附上自己的证书和随机数,给客户端。
3、客户端收到消息后,验证服务端的证书,拿出证书的公钥验证签名和hash,如果可信就像服务端发送一个 pre-master-key 的随机数,该随机数使用证书的公钥加密,发送给服务端。客户端将自己的随机数 + 对方的随机数 + pre-master-key生成对称密钥。
4、服务端接到消息后,用私钥解密,将自己的随机数 + 对方的随机数 + pre-master-key生成对称密钥。