原来的http是明文传输的,可以随意截获或篡改,所以需要HTTPS加密
HTTPS为对称加密+非对称加密
HTTPS的非对称加密与对称加密
连接建立时的请求:使用非对称加密
1.客户端发起连接请求,同时计算出一个ClientRandom发送给客户端
2.服务器使用CA私钥将CA签名、签名算法、公钥加密,同时计算出一个ServerRandom一起发送给客户端
3.客户端使用系统中内置的CA公钥进行验证解密,得到签名算法,通过算法验证签名是否有效,验证通过后可以得到服务器公钥
4.客户端计算出一个随机数,称为预主密钥(Pre-Master Secret),通过服务器公钥将随机数加密,传输给服务器
5.双方使用ClientRandom、ServerRandom、预主密钥共同计算出2个会话密钥,这两个密钥存在客户端和服务器中,不会经过网络传输
连接建立后:使用对称加密
双方通过计算出的会话密钥进行传输数据和解密
连接断开后,共同销毁对称私钥
怎么保证公钥能正确的发送到客户端而防止被掉包?
1.需要第三方CA的密钥对公钥计算摘要、签名加密,生成一个密文,这段密文,只能由CA的公钥解密,而CA的公钥如果在网络中传输也一样被截获,所以直接内置到了客户端的操作系统中,
2.CA发来的密文,使用客户端中保存的CA公钥对其解密,获得摘要
3.由于客户端系统中已经保存有数字签名,那么就可以通过CA计算的摘要,被客户端使用同样的算法得出摘要,对比2个摘要是否一致,如果一致,那么就是服务器发来的正确的未经篡改的公钥
4.客户端得到服务器的公钥后,这时就可以进行数据的传输了
如果服务器发的公钥被截获,会发生什么?
1.假如公钥被第三方截获,那么第三方就可以通过他们自己的加密工具,生成一个假的公钥,再发回给客户端
2.客户端使用假的公钥加密数据传输给服务器
3.第三方截获由客户端假加密的数据,进行解密,这时就可以获取到客户端的数据了,然后进行篡改并发去服务器
有了证书是否就安全了?
答案是不一定安全的,第三方也可以向CA申请数字签名,当服务器发回给客户端公钥时,被第三方截获,此时第三方可以进行以下操作
1.将数字签名换为第三方的数字签名,并且将其返回给客户端
2.如果客户端安装了第三方的数字签名,那么在解密CA加密的密文时,会发现使用第三方的公钥可以进行解密
3.客户端使用第三方解密之后会发现客户端计算后的摘要与CA的摘要一致,则会认为这个证书是有效的
4.之后就拿到了由第三方的服务器发来的公钥,之后再发送的密文也会被第三方解密了
所以保证数据安全重点是不能允许其他不明的证书安装进系统
证书验证的过程,只会在握手建立连接的时候进行验证,连接完成后就不需要验证了