HTTPs协议

虽然HTTP协议具有相当优秀方便的一遍,但HTTP协议可能存在信息窃听身份伪装等安全问题,HTTP有如下不足:

  • HTTP本身不具备加密功能,通信使用明文,内容可能会被窃听
  • 不验证通信方的身份,因此有可能遭遇伪装
  • 无法证明报文的完整性,所以有可能已遭篡改

按TCP/IP协议族的工作机制,通信内容在所有的通信线路上都有可能遭到窥视,即使已经过加密处理的通信也会被窥视到通信内容,只是说若通信经过加密,就有可能让人无法破解报文信息的含义,但加密处理后的报文信息本身还是会被看到。为了防止窃听保护信息,最普及的就是加密技术。

HTTP协议中的请求和响应不会对通信方进行确认任何人都可以发起请求,服务器只要接收到请求,不管对方是谁都会返回一个响应,这样就存在如下隐患:

  • 无法确定请求发送至目标的Web服务器是否是按真实意图返回响应的那台服务器,可能是已伪装的Web服务器
  • 无法确定响应返回到的客户端是否是按真实意图接收响应的那个客户端,可能是已伪装的客户端
  • 无法确定正在通信的对方是否具备访问权限
  • 无法判定请求是来自何方、出自谁手
  • 即使是无意义的请求也会接收,无法阻止海量请求下的DoS攻击Denial of Service拒绝服务攻击

HTTP协议无法证明通信报文的完整性,没有任何办法确认发出的请求和接收到的响应是前后相同的,像这样请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击称为Man-in-the-Middle attack中间人攻击MITM

虽然可使用MD5SHA-1散列值校验的方法或确认文件的数字签名,来确定HTTP报文的完整性,但这些方法并不便捷可靠,提供文件下载服务的Web网站也会提供相应的以PGP即完美隐私创建的数字签名及MD5算法生成的散列值,不论使用哪一种方法,都需要操纵客户端的用户本人亲自检查验证下载的文件是否就是原来服务器上的文件,浏览器无法自动帮用户检查,且这些方法依然无法百分百保证确认结果正确,因为若PGPMD5本身被改写,用户是没有办法意识到的。

通信加密

将通信加密,HTTP协议中没有加密机制,但可通过和Secure Socket Layer安全套接层SSLTransport Layer Security安全层传输协议TLS组合使用,从而加密HTTP的通信内容,与SSL组合使用的HTTP被称为HTTPsHTTP Secure超文本传输安全协议HTTP over SSL

SSL技术最初是由浏览器开发商网景通信公司率先倡导的,开发过SSL3.0之前的版本,目前主导权已转移到Internet Engineering Task ForceIETF的Internet工程任务组,IETFSSL3.0为基准制定了TLS1.0TLS1.1TLS1.2TSL是以SSL为原型开发的协议,有时会统一称该协议为SSL,当前主流的版本SSL3.0TLS1.0

SSL不仅提供加密处理,且还使用证书手段,可用于确定通信方证书由值得信任的第三方机构颁发,用以证明服务器和客户端是实际存在的,伪造证书从技术角度来说是异常困难的一件事。SSL提供认证加密处理摘要功能,仅靠HTTP确保完整性是非常困难的,因此通过和其他协议组合使用来实现这个目标。

内容加密

参与通信的内容本身加密,客户端需要对HTTP报文进行加密处理后再发送,且也只能加密报文主体,不能加密报文首部,为了做到有效的内容加密,前提是要求客户端和服务器同时具备加密和解密机制,但还是存在被篡改的风险。

证书验证

数字证书是为了解决SSL协议在给客户端发送真正的公开密钥时,防止公钥被攻击者替换掉,防止中间人攻击时重新生成一套秘钥对,使得客户端与伪装服务器通信。

数字证书认证机构处于客户端与服务器双方都可信赖的第三方机构的立场上,首先服务器运营人员向数字证书认证机构提出公开密钥的申请,数字证书认证机构在判明提出申请者的身份之后,对已申请的公开密钥做数字签名,然后分配该已签名的公开密钥,并将该公开密钥放入公钥证书后绑定在一起;服务器会将这份由数字证书认证机构颁发的公钥证书发送给客户端,以进行公开密钥加密方式通信;接到证书的客户端可使用数字证书认证机构的公开密钥, 对那张证书上的数字签名进行验证,一旦验证通过,则客户端便知道认证服务器的公开密钥的是真实有效的数字证书认证机构,且服务器的公开密钥是值得信赖的

认证机关的公开密钥必须安全地转交给客户端,因此多数浏览器开发商发布版本时,会事先在内部植入常用认证机关的公开密钥。

证书的一个作用是用来证明作为通信一方的服务器是否规范,另外一个作用是可确认对方服务器背后运营的企业是否真实存在,拥有该特
性的证书就是EV SSL证书即Extended Validation SSL Certificate。持有EV SSL证书的Web网站的浏览器地址栏处背景色是绿色的,且地址栏左侧会显示SSL证书中记录的组织名称以及颁发证书的认证机构名称

客户端证书

HTTPS中还可以使用客户端证书,以客户端证书进行客户端认证,但想获取证书时用户得自行安装客户端证书,但证书是收费的,安全性极高的认证机构可颁发客户端证书但仅用于特殊用途的业务。且客户端证书只能用来证明客户端实际存在,而不能用来证明用户本人的真实有效性,即只要获得了安装客户端证书的计算机的使用权限,也就意味着同时拥有了客户端证书的使用权限。

如果使用OpenSSL这套开源程序,每个人都可以构建一套属于自己的认证机构,从而自己给自己颁发服务器证书,但该服务器证书在互
联网上不可作为证书使用。

独立构建的认证机构叫做自认证机构,由自认证机构颁发的服务器证书之所以不起作用,是因为它无法消除伪装的可能性,值得信赖的第三方机构介入认证,才能让已植入在浏览器内的认证机构颁布的公开密钥发挥作用,并借此证明服务器的真实性。

证书验证

浏览器在发起HTTPs请求时,服务器会返回网站的SSL证书,浏览器需要对证书做一下验证:

  • 验证证书上的域名有效期等信息是否正确
  • 判断证书来源是否合法,每份签发证书都可以根据验证链查找到对应的根证书操作系统浏览器本地存储权威机构的根证书利用根证书可对对应机构签发证书完成来源验证
  • CA服务器进行校验,判断证书是否被篡改
  • 通过CRL证书注销列表OCSP在线证书状态协议判断证书是否已吊销

HTTPs安全通信机制

HTTPs并非应用层的一种新协议,只是HTTP通信接口部分SSLTLS协议代替而已,HTTP是直接和TCP通信,当使用SSL时,则HTTP先与SSL通信再由SSLTCP通信,所谓HTTPs其实就是身披SSL协议外壳的HTTP

SSL是独立于HTTP协议的,不光是HTTP协议,其他运行在应用层的SMTPTelnet等协议均可配合SSL协议使用,SSL是当今世界上应用最为广泛的网络安全技术

SSL采用的是非对称加密公开秘钥加密,如果使用对称加密,必须将秘钥发送给对方,如果通信被监听秘钥可能会别攻击者窃取,也就失去了加密的意义,还得设法安全的保管接收到的秘钥,非对称加密则很好的解决了该问题,因为非对称加密是使用公钥加密,私钥解密,不需要发送用来解密的私钥,不必担心秘钥被攻击者窃取。

HTTPs采用对称加密非对称加密两者并用混合加密机制非对称加密处理速度对称加密,故HTTPs利用两者的优势,在交换密钥环节使用非对称加密方式建立通信交换报文阶段则使用对称加密方式

即使如此对称加密还是存在一些问题,即无法证明公开密钥本身就是货真价实的公开密钥,如何证明收到的公开密钥就是原本预想的那台服务器发行的公开密钥,或许在公开密钥传输途中,真正的公开密钥已经被攻击者替换掉了,可使用由数字证书认证机构CACertificate Authority和其相关机关颁发的公开密钥证书来解决该问题。

HTTPs之所以使用对称加密传输数据:

  • 非对称加密相对于对称加密加解密效率是非常低
  • 只有服务端保存了私钥,一对公私钥只能实现单向的加解密,否则需要两对秘钥,这就涉及到客户端证书问题
HTTPs通信步骤

首先客户端发送一个ClientHello消息给服务端发起建立SSL会话的请求,并告诉服务端自己支持Cipher Suite加密组件列表包括所使用的加密算法秘钥长度SSL指定的版本,且产生一个随机数,用于以后生成对称密钥,发送给服务端。

服务端首次响应会确定加密协议SSL版本以及从接收的客户端加密组件中赛选出的加密组件,也会生成一个随机数响应给客户端,以ServerHello报文作为响应。

服务端把自己的Certificate证书公钥发送给客户端,让客户端进行校验,且公钥被用于加密后面握手过程中生成的对称密钥

服务器发送ServerHelloDone报文通知客户端,告知最初阶段的SSL握手协商部分结束

SSL第一次握手结束之后,客户端以Client Key Exchange报文作为回应,通知服务器此消息以后客户端会以加密方式发送数据,是使用的一种被称为Pre-master secret随机密码串进行对称加密。

接着客户端继续发送Change Cipher Spec报文,且通知服务端此报文之后的通信会采用Pre-master secret密钥加密,即使用上面的随机密码串做对称加密。

客户端发送Finished报文,该报文包含连接至今全部报文的整体校验值,若服务器是否能够正确解密该报文作,则说明本次握手协商成功。

服务器同样发送Change Cipher Spec报文,通知客户端此消息以后服务器会以加密方式发送数据

服务端发送Finished报文阶段,且服务端使用对称秘钥加密之前发送的所有握手消息的hash值给客户端,让客户端校验。

服务器客户端Finished报文交换完毕后,SSL连接就算建立完成,然后进行应用层协议通信即发送HTTP响应。

最后由客户端断开连接,断开连接时发送close_notify报文,然后再发送TCP FIN报文来关闭与TCP的通信。

在以上流程中,应用层发送数据时会附加一种叫做MACMessage Authentication Code报文摘要,MAC能够查知报文是否被篡改,从而保护报文的完整性。