本章主要讲解 HTTPS 的基本原理,以及如何利用 HTTPS 防范 HTTP 通讯过程当中存在的假装、窃听、篡改等问题git
HTTP 在通讯过程当中会面临如下三种安全问题:github
HTTP 自己不具有加密功能,因此传输过程当中都是以明文方式发送。算法
因为在网络的传输过程当中,咱们所发送的信息要通过许多的网络节点和设备,在这个过程当中这些设备是可能会拦截咱们的信息而且进行窃听的,直接经过一些经常使用的抓包工具就能够窃听未加密的网络传输信息。数据库
经过加密防止窃听浏览器
(一)通讯的加密:为了防止传输内容被窃听,咱们采起的方式之一就是通讯加密,HTTP 自己没有加密机制,可是咱们能够经过将 HTTP 和 SSL(Secure Socket Layer 安全套接层)或者 TLS(Transport Layer Security 安全传输协议)组合使用来加密 HTTP 传输内容。安全
用 SSL 创建安全通讯线路之后,就能够在这条线路上进行 HTTP 通讯了。与 SSL 组合使用的 HTTP 被称为 HTTPS(HTTP Secure)。bash
(二)内容的加密:还有一种方式就是将参与通讯的内容自己进行加密。这样的话就须要客户端对 HTTP 报文加密后再进行请求发送。因为该方式不一样于 HTTPS 将整个通讯线路加密的方式,因此内容仍然会有被篡改的风险。服务器
HTTP 协议自己并不会对通讯的另外一方进行身份验证,因此任何人都能对服务器发起请求。网络
不验证通讯方可能就会存在各类安全隐患:session
经过查明对方证书来防止假装
SSL 不只提供加密处理,并且使用了一种称为证书的手段,可用于确认对方身份。
证书由第三方机构颁发,用以证实服务器和客户端是实际存在的。
经过使用证书能够证实通讯方就是意料中的服务器。对使用者而言,也减小了我的信息泄露的风险。
另外,客户端持有证书便可完成我的身份的认证,也可用于对网站的认证环节。
HTTP 协议一般没法确认信息的完整性,一旦传输的信息被篡改,那么信息就失去了准确性,致使信息有误。好比你想在某个网站下载一个资源,而你的网络传输已经被别人所劫持,在你发起下载请求的时候,你所接收到的资源正在被人修改,因此你下载到的资源就不是你想要的那个了。
像这样,请求或者响应在传输途中遭攻击者拦截并篡改内容的攻击称为中间人攻击(Man-in-the-Middle attack, MITM)。
如何防止篡改
以前的章节有提到过 Content-MD5 实体首部字段可用于确认实体内容是否完整,可是因为 Content-MD5 自己的值也可能被篡改,因此这个字段并不可靠,因此须要其余方法来确保传输的内容不被篡改。
经过其余散列算法来计算传输内容是否完整也不可靠,那么咱们最终仍是须要 HTTPS 来帮咱们解决这个问题。SSL 提供认证和加密处理以及摘要功能。
HTTPS = HTTP + 加密 + 认证 + 摘要
复制代码
HTTPS 并不是是应用层的一种新协议。只是 HTTP 通讯接口部分用 SSL 和 TLS 协议代替而已。
一般,HTTP 直接和 TCP 通讯。当使用 SSL 的时候,就先和 SSL 通讯,再由 SSL 和 TCP 通讯了。因此简而言之,HTTPS 就是身披 SSL 外壳的 HTTP 协议。
在采用 SSL 之后,HTTP 就拥有了 HTTPS 的加密、证书和完整性保护功能了。
SSL 协议是独立于 HTTP 的协议,因此其余协议也能够采用 SSL 协议,它是当今世界上应用最普遍的网络安全技术
在讲 SSL 以前能够先了解一下加密方法,SSL 采用一种叫作公开密钥加密(Public-key Cryptography)的加密处理技术。
近代的加密方法中,加密算法是公开的,可是密钥是保密的。加密和解密都会用到密钥。没有密钥就没法对密钥进行解密。反过来讲,任何人只要拿到了密钥就能够解密信息。若是密钥被攻击者得到,那加密也就失去了意义。
加密和解密使用同一个密钥的方式称为共享密钥加密(Common key crypto system),也被叫作对称密钥加密。
采用共享密钥加密方式加密时,须要将密钥一块儿发送给通讯方,因此有须要考虑密钥传输的安全性,须要设法安全地保管密钥,这即是共享密钥加密方式的困扰。
公开密钥加密方式很好的解决了共享密钥加密方式的困扰。
公开密钥加密使用一对非对称的密钥。一把叫作私有密钥(private key),另外一把叫作公开密钥(public key)。顾名思义,私有密钥不能被其余任何人知道,而公开密钥则能够仁任意传播,任何人均可以拿到。
使用公开密钥加密方式(非对称加密),发送密文的一方使用公钥进行加密处理,而接收方拿到被加密后的信息以后再使用本身的私钥进行解密。利用这种方式进行传输,就不须要发送密钥,也就不用担忧密钥被攻击者拿走了。
HTTPS 采用共享密钥加密方式和公开密钥加密方式混用的加密方式。
若是密钥能够被安全传输,则 HTTPS 会考虑采用共享密钥加密方式,不然将采用公开密钥加密方式。这是由于公开密钥加密方式的速度比共享密钥加密方式要慢。HTTPS 充分地利用了二者的优势,将多种方法组合起来用于通讯。在使用公开密钥加密方式交换密钥以后,以后的信息传输使用共享密钥加密方式。
遗憾的是公开密钥加密方式自己也是有缺陷的,那就是没法证实公开的密钥自己是货真价实的。
为了解决上面说到的问题,可使用由数字证书认证机构(CA,Certificate Authority)和其相关机构颁发的公开密钥证书。
数字证书认证机构处于客户端与服务端双方都信赖的第三方机构的立场上,威瑞新(VeriSign)就是其中一家很是有名的数字证书认证机构。
下面讲解一下数字证书认证机构的业务流程:
首先,服务器的运营人员会向数字机构提出公开密钥申请,CA 在认证申请者的身份信息以后,会对已申请的公开密钥进行数字签名,而后分配这个已签名的公开密钥,并将该公开密钥放入公钥证书以后绑定在一块儿。
服务器会将这份 CA 颁发的公钥证书发送给客户端,以进行公钥加密方式通讯,公钥证书也可叫作数字证书或者直接称为证书。
接到证书的客户端可以使用 CA 的公钥对证书的数字签名进行认证,一旦验证经过,客户端即可确认两件事:
因而这就达到了确认公钥真实有效性的目的。
安全地转交 CA 机构的密钥给客户端是一件困难的事,所以多数浏览器会在内部植入经常使用认证机构的公钥。
证书的一个做用是证实做为通讯一方的服务器是否符合规范,另外一个做用是确认服务器运营商企业是否真实存在。可以证实企业真实性的正式就是 EV SSL 证书(Extended Validation SSL Certificate)。
该证书的目的是为了防止钓鱼攻击(Phishing)。
HTTPS 中还可使用客户端证书对客户端进行认证。
第八章要讲的内容很少,因此把最重要的一点挪到了这一篇笔记。
关于用户身份的认证,如今多数是采用表单认证,通常会采用 Cookie 来管理 Session(会话)。
大体流程以下:
具体步骤以下:
httponly
属性来禁止 JavaScript 修改 Cookie,防止跨站脚本攻击。