HTTP的缺点
- 1.通信使用明文(不加密),内容可能可能会被窃听
- 2.不验证通信方的身份,因此可能遭遇伪装
- 3.无法验证报文的完整性,所以可能已被篡改
HTTPS = HTTP+加密+认真+完整性保护
1.加密处理和认证
如果在http中使用未经加密的明文,比如在web页面中输入了信用卡号,如果这条通信线路找到窃听,那么你的信用卡号就暴露了,另外服务端和客户端都是没法确认通信方的,所以很有可能不是在与理想中的通信方进行通信,所获取到的报文可能是被篡改过的
为了统一解决这些问题,需要在http的基础上加上加密和认证的机制
2.https是身披ssl的http
https并非是一种新的协议,它只是在http通信接口处使用了部分ssl或者tls协议罢了,通常都是http和tcp通信,现在变成了先和ssl通信,再由ssl与tcp通信
3.相互交换秘钥的公开加密技术
对称加密:采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
非对称加密:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密
https使用的是混合加密,因为如果只使用对称加密,需要在通信中传输共享秘钥,这个过程有可能会被攻击者劫持和篡改,如果秘钥落入别人手里那么加密就没有意义了,如果单单是使用非对称加密,公钥加密私钥解密这种新式,目前的技术是做不到凭着密文和公钥获取明文的,不过这样的方式效率实在是太低了,所以https采用了两周的优点,使用非对称加密的形式来传递对称加密的共享秘钥
然而采用第三方机构证书的形式是包装了,非对称加密公钥是真实可信的,公钥密码在数字签名技术里面扮演举足轻重的角色,但是如何保证公钥是合法的呢,如果是遭到中间人攻击,掉包怎么办?这个时候公钥就应该交给一个第三方权威机构来管理,这个机构就是认证机构(Certification Authority)CA,CA 把用户的姓名、组织、邮箱地址等个人信息收集起来,还有此人的公钥,并由 CA 提供数字签名生成公钥证书(Public-Key Certificate)PKC,简称证书
Https安全通信机制过程
HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。
- 客户端发起HTTPS请求:这个没什么好说的,就是用户在浏览器里输入一个https网址,然后连接到server的443端口
- 服务端的配置:采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。这套证书其实就是一对公钥和私钥。如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。
- 传送证书:这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
- 客户端解析证书:这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值。然后用证书对该随机值进行加密。就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容
- 传送加密信息:这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
- 服务段解密信息:服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
- 传输加密后的信息:这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。
- 客户端解密信息客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容。整个过程第三方即使监听到了数据,也束手无策。
中间人攻击
根本原因是浏览器无法确认自己收到的公钥是不是网站自己的
流程:
- 某网站拥有用于非对称加密的公钥A、私钥A’。
- 浏览器向网站服务器请求,服务器把公钥A明文给传输浏览器。
- 中间人劫持到公钥A,保存下来,把数据包中的公钥A替换成自己伪造的公钥B(它当然也拥有公钥B对应的私钥B’)。
- 浏览器随机生成一个用于对称加密的密钥X,用公钥B(浏览器不知道公钥被替换了)加密后传给服务器。
- 中间人劫持后用私钥B’解密得到密钥X,再用公钥A加密后传给服务器。
- 服务器拿到后用私钥A’解密得到密钥X。