http(hyperText Trandfer Protocol,超文本传输协议)的推广除了当年大佬的推广,最主要是因为它足够简单:不考虑加密处理,不考虑验证身份、不考虑报文完整性,只考虑如何传递超文本;
https的诞生均源自http因简单而导致的不足
- http的不足:
- 使用明文传递,内容易被窃听;
- 不验证通信双方的身份,可能遭遇伪装;
- 不能证明报文是否完整,可能已遭篡改
下面详细说明为何会有这些不足和解决方法
- 被窃听
- http协议基于TCP/IP网络,TCP/IP网络是当前互联网的基本架构,由于互联网是全世界共享的,并非个人私有物,所以很容易被窃听
- 在TCP/IP网络上,即便是加密处理的通信,其本身依然很容易被窃听到;使用最简单的抓包工具就能获取http的请求和相应内容
- 加密处理后的通信虽被窃听,但降低了原始内容被窥探的风险,所以仍是必要的;可以通过SSL层或TLS协议的组合使用,加密http的通信内容。与SSL组合使用的http被称为https
- 还有一种将参与通信的内容本身加密的方式。但由于改加密要求客户端和服务器同时具备加密和解密机制,所以内容仍有被篡改的风险,稍后会加以说明
- 身份伪装
- 通信双方均不验证对方是否是自己想通信的那个
- web服务器不能确定正在通信的对方是否具备访问权限
- 不能判定请求来自何方,出自谁手
- 无意义的请求也会全收,不能阻止海量请求下的DoS攻击
SSL提供了“证书”,可用于确定方:
- 证书:由值得信任的第三方机构颁发,用来证明通信中某一方的身份
- 伪造证书相对来说比较困难
- 篡改报文
- http不能确认,发出的请求/响应和接收到的请求/响应是前后相同的,即不能保证报文完整性(完整性指信息的准确度)
可能出现以下这种情形:
http+加密+认证+完整性保护=https
当前ssl版本为3.0
https是身披SSL外壳的http
- 以前,http直接和tcp通信
- 现在,http先和SSL通信,再由SSL和tcp通信
ssl是独立于http的协议,很多协议都可以搭配ssl使用;ssl是当今世界上应用最广泛的网络安全技术
公开密钥加密技术
- 这是ssl的加密处理方式,使用两把密钥的公开密钥加密——私有密钥和公有密钥
- 发送密文的一方事先收到对方的公开密钥,然后用之对报文进行加密,发送给对方;对方收到后使用自己的私有密钥进行解密
- 窃听者只能拿到密文和公开密钥,但是很难恢复到信息原文
https采用混合加密机制——共享密钥加密和公开密钥加密两者并用(共享密钥很简单,这里不做赘述)
- 因为公开密钥加密耗时较多,所以在通信时,交换密钥环节使用公开密钥加密(加密的是共享密钥),之后交换报文时使用共享密钥加密
公开密钥加密的问题
- 公开密钥在传输中仍是有可能被替换的,因为能被窃听者拿到
- 为了解决以上问题,引入数字证书认证机构(CA)和其颁发的公开密钥证书
- 服务器的运营人员向CA提出公开密钥的申请
- CA判明申请者的身份后,对公开密钥做数字签名
- 将已签名的公开密钥放入公钥证书,颁发证书给运营人员
- 服务器将证书发给客户端,以进行公开密钥加密方式通信
- 公钥证书也叫数字证书或直接称为证书
- 接收到证书的客户端可通过CA的公开密钥,对证书上的数字签名进行验证;一旦验证通过,客户端便可明确两件事:CA真实有效;服务器的公开密钥值得信赖
- 又来问题了:CA的公开密钥如何安全的传递给证书?一般的,浏览器开发商会给浏览器植入常用CA的公开密钥
证书
- 分为证明服务器和客户端的;服务器的为EV SSL证书
- 证明客户端的证书目前只在一些特定场景下使用:如支付业务。因为客户端如果想获取证书,需要用户自行安装客户端证书;但是证书是需要付费的,且不是所有用户都能理解证书的相关概念,导致他们很难自行安装
- 客户端证书还有一个问题,即只能用来证明客户端实际存在,但是不能证明用户本人的真实有效性
- CA机构本身也并非完全可靠,曾出现过黑客入侵后颁布伪造证书的情形
- 自签名证书:安装了OpenSSL这套开源程序后,每个人都可以构建一套属于自己的认证机构,从而自己给自己颁发服务器证书;但是互联网上不承认。所以浏览器访问该服务器时,会显示:
完整性保护
-
先了解https通信过程:
- 客户端发送client hello报文进行ssl通信。报文中包含客户端支持的ssl版本、加密组件列表
- 服务器可进行ssl通信,则回之server hello报文。报文中包含ssl版本及加密组件(从客户端传递的加密组件列表内筛选出来)
- 服务器发送certificate报文,报文中包含公开密钥证书
- 最后服务器发送server hello done报文,通知客户端第一次ssl握手结束
- 客户端回应之client key exchange报文,报文中包含共享加密的密钥,此密钥已被3步骤中的公开密钥加密
- 客户端继续发送change cipher spec报文,该报文提示服务器之后的通信会采用刚刚提供的密钥加密
- 客户端发送finished报文,该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准
- 服务同样发送change cipher spec报文
- 服务器同样发送finished报文,ssl连接建立完成
- 应用层协议通信,即发送http响应
- 客户端断开连接:发送close_notify报文;之后再发送tcp fin报文关闭与tcp的通信
-
以上流程中,应用层发送数据时会附加一种叫mac(message authentication code)的报文摘要。mac能够查知报文是否遭到篡改,从而保护报文的完整性
https的缺点
- https比http要慢2~100倍:因为必须进行ssl通信,且加密解密增加运算处理(现在有ssl加速器这种硬件来改善问题)
- 购买证书会花费一定开销