文章目录
http 风险与应对
- 通信使用明文(不加密),内容可能会被窃听
底层协议TCP/IP会被窃听,Wireshark可以抓数据包。 - 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
防窃听
通信加密 http +ssl
通过和 SSL(Secure Socket Layer,安全套接层)或TLS(Transport Layer Security,安全层传输协议)的组合使用,加密 HTTP 的通信内容
用 SSL建立安全通信线路之后,就可以在这条线路上进行 HTTP通信了。与 SSL组合使用的 HTTP 被称为 HTTPS(HTTPSecure,超文本传输安全协议)或 HTTP over SSL。
内容加密
客户端和服务端都具备加密和解密机制,还是会有被篡改风险。
验证身份
查看对手的 证书,https使用ssl。ssl不仅可以加密处理,还能提供证书。
验证报文完整性
md5或sha-1 对内容签名认证
HTTP+ 加密 + 认证 + 完整性保护=HTTPS
加密技术
https采用 混合加密(公开**+共享加密),当**能够可靠交换时,使用共享加密。
共享加密
加解密用一个**,传递给对方式,**有泄露危险,但是速度比公开**要快。
SSl-公开**加密(Public-key cryptography)
非对称加密。有一对**:公钥+私钥。将公钥交给对方,对方使用公钥对内容加密,自己用私钥解密
遗憾的是,公开**加密方式还是存在一些问题的。那就是无法证明公开**本身就是货真价实的公开**。比如,正准备和某台服务器建立公开**加密方式下的通信时,如何证明收到的公开**就是原本预想的那台服务器发行的公开**。或许在公开**传输途中,真正的公开**已经被攻击者替换掉了。
为了解决上述问题,可以使用由数字证书认证机构(CA,CertificateAuthority)和其相关机关颁发的公开**证书。数字证书认证机构处于客户端与服务器双方都可信赖的第三方机构的立场上。威瑞信(VeriSign)就是其中一家非常有名的数字证书认证机构。我们来介绍一下数字证书认证机构的业务流程。首先,服务器的运营人员向数字证书认证机构提出公开**的申请。数字证书认证机构在判明提出申请者的身份之后,会对已申请的公开**做数字签名,然后分配这个已签名的公开**,并将该公开**放入公钥证书后绑定在一起。
服务器会将这份由数字证书认证机构颁发的公钥证书发送给客户端,以进行公开**加密方式通信。公钥证书也可叫做数字证书或直接称为证书。
接到证书的客户端可使用数字证书认证机构的公开**,对那张证书上的数字签名进行验证,一旦验证通过,客户端便可明确两件事:
一,认证服务器的公开**的是真实有效的数字证书认证机构。二,服务器的公开**是值得信赖的。
此处认证机关的公开**必须安全地转交给客户端。使用通信方式时,如何安全转交是一件很困难的事,因此,多数浏览器开发商发布版本时,会事先在内部植入常用认证机关的公开**。
简单点说,认证机构拥有一对
公/私钥。服务器也有一堆自己的公/私钥。服务器向认证机构申请,那么认证机构用自己的私钥给服务器公钥加个密,这个结果叫证书。客户端拿到服务器发送给自己的公钥和证书后怎么验证服务器的公钥是真的。很简单,用认证机构的公钥给服务器公钥也加个密,这个结果与证书相等。一般,浏览器会内置知名的认证机构公钥,这样就不用下载了。
EV SSl证书
证明运行组织的真实性,而不是钓鱼网站
认证机构
略,认证机构被攻破也是有风险的
openssl 自认证机构
如果使用 OpenSSL这套开源程序,每个人都可以构建一套属于自己的认证机构,从而自己给自己颁发服务器证书。但该服务器证书在互联网上不可作为证书使用,似乎没什么帮助。
只能保证自己的服务器是安全的,但是在互联网上没有信誉度。
https 的通信过程
- 步骤 1: 客户端通过发送 Client Hello 报文开始 SSL通信。报文中包含客户端支持的 SSL的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及**长度等)。
- 步骤 2: 服务器可进行 SSL通信时,会以 Server Hello 报文作为应答。和客户端一样,在报文中包含 SSL版本以及加密组件。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。
- 步骤 3: 之后服务器发送 Certificate 报文。报文中包含公开**证书。
- 步骤 4: 最后服务器发送 Server Hello Done 报文通知客户端,最初阶段的 SSL握手协商部分结束。
- 步骤 5: SSL第一次握手结束之后,客户端以 Client Key Exchange 报文作为回应。报文中包含通信加密中使用的一种被称为 Pre-master secret 的随机密码串。该报文已用步骤 3 中的公开**进行加密。
- 步骤 6: 接着客户端继续发送 Change Cipher Spec 报文。该报文会提示服务器,在此报文之后的通信会采用 Pre-master secret **加密。
- 步骤 7: 客户端发送 Finished 报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。
- 步骤 8: 服务器同样发送 Change Cipher Spec 报文。
- 步骤 9: 服务器同样发送 Finished 报文。
- 步骤 10: 服务器和客户端的 Finished 报文交换完毕之后,SSL连接就算建立完成。当然,通信会受到 SSL的保护。从此处开始进行应用层协议的通信,即发送 HTTP 请求。
- 步骤 11: 应用层协议通信,即发送 HTTP 响应。
- 步骤 12: 最后由客户端断开连接。断开连接时,发送 close_notify 报文。上图做了一些省略,这步之后再发送 TCP FIN 报文来关闭与 TCP的通信。
在以上流程中,应用层发送数据时会附加一种叫做 MAC(MessageAuthentication Code)的报文摘要。MAC 能够查知报文是否遭到篡改,从而保护报文的完整性。
下面是对整个流程的图解。图中说明了从仅使用服务器端的公开**证书(服务器证书)建立 HTTPS 通信的整个过程
CBC 模式(Cipher Block Chaining)又名密码分组链接模式。在此模式下,将前
一个明文块加密处理后和下一个明文块做 XOR 运算,使之重叠,然后再对运算
结果做加密处理。对第一个明文块做加密时,要么使用前一段密文的最后一块,
要么利用外部生成的初始向量(initial vector,IV)。——译者注
TLS与SSL
HTTPS 使用 SSL(Secure Socket Layer) 和 TLS(Transport LayerSecurity)这两个协议。SSL技术最初是由浏览器开发商网景通信公司率先倡导的,开发过 SSL3.0 之前的版本。目前主导权已转移到 IETF(Internet Engineering Task Force,Internet 工程任务组)的手中。IETF 以 SSL3.0 为基准,后又制定了 TLS1.0、TLS1.1 和TLS1.2。TSL是以 SSL为原型开发的协议,有时会统一称该协议为 SSL。当前主流的版本是 SSL3.0 和 TLS1.0。由于 SSL1.0 协议在设计之初被发现出了问题,就没有实际投入使用。SSL2.0 也被发现存在问题,所以很多浏览器直接废除了该协议版本。
HTTPS 比 HTTP 要慢 2 到 100 倍