HTTPS的四次握手
- 客户端: 你好,我要发起一个 HTTPS 请求,请给我公钥
- 服务器: 好的,这是我的证书,里面有公钥
- 客户端: 解密成功以后告诉服务器: 这是我的随机对称秘钥 (用公钥加密后的) 。
- 服务器: 好的,我知道你的秘钥了,后续就用它传输。
证书是怎样验证的?怎样保证中间人不能伪造证书?
- 在服务器端发送证书后,浏览器根据预先安装的权威机构的公钥验证证书的有效性,如果有效则使用证书的公钥加密一个随机生成的对称密钥用于后续的通信。
- 客户端的浏览器和内置操作系统内部都有一个权威机构所颁发的根证书列表,这些列表中有能够解密私钥的钥匙(这个钥匙和给随机生成的
对称密钥
加密的公钥
是不同的) - 客户端发起https请求后,服务器把证书(证书内容和公钥,这个公钥于之前的钥匙是不同的,这个公钥匙加密对称密钥的,这些事明文传输)和证书的哈希值(哈希值经过服务器私钥加密)发送给客户端,由于传送过程中经过私钥加密的哈希值不能被修改(修改以后经过客户端钥匙解释出来的是乱码),所以如果证书内容被修改,那么就会和传送过来的证书哈希值不匹配,所以可以知道证书被篡改和伪造的了。
浏览器里面的钥匙(公钥)、证书里面的公钥、服务器私钥、随机的对称密钥,都是什么?
- 浏览器里面的钥匙(CA的公钥):作用是验证证书
- 证书里面的公钥:对称加密过程,给对称密钥加密,然后传送到服务器
- 对称密钥:客户端随机生成的,用于客户端与服务器的后续通信
- 服务器私钥:解密客户端发来的用公钥加密的对称密钥