https我来了哦
解决http出现的问题
http存在的三个弊端:
- 无法保证消息的保密性(http明文传输)
- 无法保证消息的完整性和准确性(可能被篡改)
- 无法保证消息来源的可靠性(不检验双方身份)
什么是https
https=http+加密+认证+完整性保护
SSL协议(Secure Sockets Layer)(Application Layer)
加强版TCP
HTTPs是HTTP报文直接将报文信息传输给SSL套接字进行加密,SSL加密后的报文发送给TCP套接字,然后TCP套接字再将加密后的报文发送给目的主机,目的主机将通过TCP套接字获取加密后的报文发给SSL套接字,SSL解密后交给对方进程
对称加密(共享密钥加密)
- server和client公用一个密钥用来对消息加解密
- server和client约定好一个加密的密钥
- client在发消息之前用该密钥对消息加密,发送给服务器后,服务器在用该密钥解密拿到信息
对称加密的优点:
- 对称加密解决了http中消息保密性的问题
对称加密的缺点:
- 虽然保证了消息保密性,但是因为客服端和服务器共享一个密钥,这样就使得密钥特别容易泄露
- 由于容易泄露,很难保证消息来源的可靠性、消息的完整性、准确性
非对称加密(公有密钥加密)
- client和server都拥有一个公共密钥和私有密钥。
- 公有密钥可以i对外可见,私有密钥仅自己可见
- 使用公有密钥加密的消息,只有对应的私钥才能解开,反过来,使用私有密钥加密的消息,也只有对应公钥才能解开。
- client发送消息之前,先用server的公钥对消息进行加密,server收到后再用自己的私钥进行解密
非对称加密的优点:
- 解决了http中消息保密性的问题,而使得私有密钥泄露的风险降低
- 保证了消息来源和准确与完整
非对称加密的缺点:
- 非对称加密需要使用接收方的公钥对信息进行加密,但公钥对外可见,任何人包括中间人都可以拿到,第一件事中间人可以在client和server之间交换公钥时,将client的公钥替换成自己的,这样server拿到的公钥不是client的,而是server的,导致无法判断来源
- 中间人可以不替换公钥,可以截取client发来的消息,然后篡改,再用client的公钥加密再发往server,篡改消息内容
- 非对称加密的速度很慢,比较消耗系统资源
数字证书与数字签名
为了解决非对称加密中公钥来源的不安全性
-
server向CA(Certificate Authority)认证中心申请数字证书
- server生成一对密钥,拿着公钥以及企业名称这种其他信息去CA申请数字证书 - CA拿到信息后,会选择一种单向Hash算法(特点:单向不可逆,只要原始内容有一点变化,加密后的数据都千差万别),对信息进行加密,加密之后我们将它称之为摘要 - CA用自己的私钥对摘要进行加密,加密后的数据我们称之为数字签名 - CA将我们的申请信息和数字签名整合在一起,生成数字证书,然后CA将数字证书传递给我们
-
数字证书起作用的过程
- server获取到了数字证书,将数字证书发给client,client需要用CA的公钥解密数字证书并验证数字证书的合法性 - CA公钥获得:电脑和浏览器中已经内置了一部分权威机构的根证书,这些根证书中包含了CA的公钥 - client用CA的公钥解密数字证书,如果解密成功则说明证书来源于合法的认证机构,解密成功后,client拿到了摘要 - client会按照CA一样的hash算法将申请信息生成一份摘要,和解密出来的做对比,内容相同则说明没有被篡改 - client拿到了server的公钥,就可以和服务器进行安全的非对称加密通信了
HTTPS建立
https建立的过程:
- client通过发送Client Hello开始SSL通信。报文中包含client支持的SSL的指定版本、加密组件(Cipher Suite)列表(包含使用的加密算法和密钥长度等)
- server可进行SSL通信时,会以Server Hello报文作为报答。与client相同,报文中会包含SSL版本和加密组件(但这个加密组件是server经过client的加密组件筛选后的)
- server发送证书报文,报文中包含公开密钥证书(跟CA申请得到的那个数字证书)
- server发送Server Hello Done通知client,最初阶段的SSL握手协商部分结束
- SSL第一次握手结束后,client发送Client Key Exchange报文作为回应。报文中包含通信加密中使用的一种被成为Pre-master secret的随机密码串,这次的报文已经开始用server的公钥进行加密了
- client继续发送Change Cipher Spec报文,意思是提示server,之后的报文通信会用Pre-master secret密钥进行加密
- server发送Finished报文,包含连接至今全部报文的整体校验值,这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准
- server同样发送Change Cipher Spec报文
- server同样发送Finished报文
- server和client的报文交换完毕后,SSL连接就算建立完成。
- 应用层协议通信,开始发送HTTP请求和响应
HTTPS的四次握手
- 客户端发出请求(Client Hello):client向server发起加密通信的请求
- 服务器回应(Server Hello):server收到client请求后,确认SSL版本是否一致,一致则返回server证书,不一致就关闭通信
- 客户端回应:client收到server回应后,client验证server的证书是否有效。如果证书失效,会给用户提示,由用户决定是否继续连接。如果有效,则使用证书中的公钥加密一个随机数(pre-master key)返回给server,同时返回server握手结束finished
- 服务器回应:server收到pre-master key之后,计算生成本次会话的密钥,向client发送finished结束通知
https使用
- 适用于安全性需要比较高的场景,银行、购物等。
- 虽然消息安全传输,但消息加解密非常耗时,占用系统资源,所以安全性不高不用使用
- https需要数字证书,价格不菲,对安全性要求不高也没必要使用。