HTTPS安全性原理以及其对前端的影响

我去前面探探路

Posted by ZX on December 18, 2016
HTTPS安全性原理以及其对前端的影响

HTTPS安全性原理以及其对前端的影响

一、什么是HTTPS

超文本传输安全协议(HTTPS,(HyperText Transfer Protocol Secure)也被称为HTTP over TLS,HTTP over SSL)是一种网络安全传输协议。它是一个安全通信通道。它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。

HTTPS开发的主要目的,是提供对网络服务器的认证,保证交换信息的机密性和完整性。

二、HTTP和HTTPS的区别

a、http是普通的超文本传输协议,信息是明文传输,https 则是具有安全性的加密传输协议。

b、http和https使用的是不同的连接方式用的端口也不一样,前者是80,后者是443。

c、https协议需要到ca申请证书,一般免费证书很少,需要交费。

三、HTTPS 是如何保证安全的?

3.1、如何保证信息数据的安全传递

如果用HTTP协议传递信息那么,数据信息是明文传递的,如果有中间人截获了,这次信息传递,那么客户端发出的内容都会被看到。

所以很直接保护信息安全的方式就是给这段信息加密,那么选择何种加密方式呢?

首先想到的加密方式,从原始简单的角度考虑,对信息的加密和解密都用同一种规则去做,用两把同样的钥匙去锁和开同一把锁。这就是对称加密方式

对称加密(symmetric cryptography)使用相同的key加密和解密。

这种对称加密算法比较流行的是AES算法,用一个统一的key来加密和解密数据,AES 使用数学矩阵的方式在数学上保证了,只要你使用的 key 足够足够足够足够的长,破解是几乎不可能的。但是对称加密的本质决定了它有两个问题。

1.密钥管理

如果互联网每天有无数信息需要加密,一旦通信的实体多了,那么管理秘钥就会成为问题。

2.对称加密密钥的拦截

客户端需要发送信息,用AES加密里信息数据,生成一个对应的key,但是如何把这个key告诉服务端使用其进行解密呢?不管是和数据一起传给服务端,还是单独传给服务端都会经过网络传输,而这过程中不被发现和获取就很难了。

非对称加密(asymmetric cryptography)使用不同的keys(公钥和私钥)加密和解密。

RSA算法举例

RSA算法是目前最流行的公钥密码算法它使用长度可以变化的密钥。RSA是第一个既能用于数据加密也能用于数字签名的算法。

RSA算法的原理如下

1.随机选择两个大质数P和Q,P不等于Q,计算 N = P*Q

2.选择一个大于1小于N的自然数e:e必须与T = (P-1)×(Q-1)互质

3.用公式计算出d:d*e ≡ 1(mod T) → d*e = k*T + 1

4.销毁P和Q

最终得到的N和e就是"公钥" d就是"私钥" 发送方使用N去加密数据,接收方只有使用d才能解开数据内容。

P:23、Q:29

N = P*Q = 23*29 = 667

T = (P-1)*(Q-1)=22*28=616

e=3

d = (k*616 + 1)/e = (2*616 + 1)/3 = 411

加密:

信息m转化为大数 M = 666且M < N=667

将大数M加密为大数C

M^e ≡ C (mod N)

解密:

C^d ≡ M (mod N)

RSA的安全性依赖于大数分解

只要密钥长度足够长,用RSA加密的信息实际上是不能被解破的。举例来说,你可以对3233进行因数分解(61×53),但是你没法对下面这个整数进行因数分解。

1230186684530117755130494958384962720772853569595334792197322452151726400507263657518745202199786469389956474942774063845925192557326303453731548268507917026122142913461670429214311602221240479274737794080665351419597459856902143413

它等于这样两个质数的乘积:

33478071698956898786044169848212690817704794983713768568912431388982883793878002287614711652531743087737814467999489

*

36746043666799590428244633799627952632279158164343087642676032283815739666511279233373417143396810270092798736308917

你可能会问,公钥(n,e) 只能加密小于n的整数m,那么如果要加密大于n的整数,该怎么办?有两种解决方法:一种是把长信息分割成若干段短消息,每段分别加密;另一种是先选择一种"对称性加密算法"(比如DES),用这种算法的密钥加密信息,再用RSA公钥加密DES密钥。

非对称加密的中间人攻击和信息抵赖

设想一种情景:这时C→S的完整加密变成了,C(加密)→M(明文)→(加密)S的情况了,这时候M还是可以知道A和B传输中的全部信息。而信息抵赖如上图

为此需要引入权威的第三方机构CA(certificate angency)。CA负责核实公钥的拥有者的信息,并颁发认证”证书”,同时能够为使用者提供证书验证服务,即PKI体系。

CA证书及签名

身份认证的方式就是通过证书以数字方式签名的声明,它将公钥与持有相应私钥的主体(个人、设备和服务)身份绑定在一起。通过在证书上签名,CA可以核实与证书上公钥相应的私钥为证书所指定的主体所拥有。

你的 Windows、Mac、Linux、Chrome、Safari等会在安装时带上一个他们认为安全的 CA 证书列表。如果和你建立安全连接的人带着这些人的签名,那么认为这个安全连接是安全的,没有遭到中间人攻击。

证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构CA的信息、有效时间、证书序列号等信息的明文,同时包含一个签名。

证书链

如CA根证书和服务器证书中间增加一级证书机构,即中间证书,证书的产生和验证原理不变,只是增加一层验证,只要最后能够被任何信任的CA根证书验证合法即可。

二级证书结构存在的优势:

a.减少根证书结构的管理工作量,可以更高效的进行证书的审核与签发;

b.根证书一般内置在客户端中,私钥一般离线存储,一旦私钥泄露,则吊销过程非常困难,无法及时补救;

c.中间证书结构的私钥泄露,则可以快速在线吊销,并重新为用户签发新的证书;

d.证书链四级以内一般不会对HTTPS的性能造成明显影响。

CA 证书通常情况下是安全的。因为一旦某个 CA 颁发出的某个证书被用于了非法用途,浏览器和操作系统一般会通过更新将整个 CA 颁发过的全部证书全部视为不安全。这使得 CA 通常在颁发证书时是比较小心的。

所以通过对称加密 + 非对称加密 + CA认证这三个技术混合在一起,才使得 HTTP 的后面加上了一个 S —— Security。

其中任何一环稍有闪失,就会使得整个加密都将变得不安全。这也是为什么 HTTPS 的加密协议从SSL 1.0 升级到 SSL 3.0 再到 TLS 1.0 现在被 TLS 1.2 取代,其背后都是一环环细节上的修改,以防任何地方的闪失。

3.2、HTTPS的传输过程

简单来说就是先进行SSL/TLS的安全通道建设,然后用加密协议加密数据,再进行基本的HTTP数据传递。

SSL和TLS协议

SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。

TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。

SSL由从前的Netscape公司开发有1,2,3三个版本,但现在只使用版本3,TLS是SSL的标准化后的产物有1.0 1.1 1.2三个版本默认使用1.0,TLS1.0和SSL3.0几乎没有区别,事实上我们现在用的都是TLS,但因为历史上习惯了SSL这个称呼平常还是以SSL为多。

TLS/SSL的功能实现主要依赖于三类基本算法:散列函数Hash、对称加密和非对称加密。

结合三类算法的特点,TLS的基本工作方式是:

TLS握手:安全通道是如何建立的

0 ms

TLS运行在一个可靠的TCP协议上,意味着我们必须首先完成TCP协议的三次握手。

56 ms

在TCP连接建立完成之后,客户端会以明文的方式发送一系列说明,比如使用的TLS协议版本,客户端所支持的加密算法等。

84 ms

服务器端拿到TLS协议版本,根据客户端提供的加密算法列表选择一个合适的加密算法,然后将选择的算法连同服务器的证书一起发送到客户端。

112 ms

假设服务器和客户端协商后,得到一个共同的TLS版本和加密算法,客户端检测服务端的证书,非常满意,客户端就会要么使用RSA加密算法(公钥加密)或者DH秘钥交换协议,得到一个服务器和客户端公用的对称秘钥。

140 ms

服务器处理由客户端发送的秘钥交换参数,通过验证MAC(Message Authentication Code,消息认证码)来验证消息的完整性,返回一个加密过的“Finished”消息给客户端。

168 ms

客户端用协商得到的堆成秘钥解密“Finished”消息,验证MAC(消息完整性验证),如果一切ok,那么这个加密的通道就建立完成,可以开始数据传输了。

在这之后的通信,采用对称秘钥对数据加密传输,从而保证数据的机密性。

四、HTTPS性能与优化

4.1、性能损耗

前文讨论了HTTPS原理与优势:身份验证、信息加密与完整性校验等,且未对TCP和HTTP协议做任何修改。但通过增加新协议以实现更安全的通信必然需要付出代价,HTTPS协议的性能损耗主要体现如下:

加密/解密的过程是需要消耗时间

毕竟需要对传输的数据进行加密/解密,算法耗时是肯定有的。

交换公钥/私钥消耗时间

https传输在传输之前是需要再服务端与客户端交换公钥/私钥的,这个过程也是非常耗时的。有统计称https的链接耗时是http的连接耗时的3倍。

跳转消耗时间

这里还有一个影响速度的点,那就是用户在浏览器中输入网址的时候,是不会去自己输入https协议头的,如果我们想要用户访问https的网站的话,就要自己进行一次网页重定向,重定向也是比较耗时的操作。这都会对我们的网站速度造成影响。

4.2、性能优化

1.选择性的使用

假如为了安全保密,将一个网站所有的Web应用都启用SSL技术来加密,并使用HTTPS协议进行传输,那么该网站的性能和效率将会大大降低,而且没有这个必要,因为一般来说并不是所有数据都要求那么高的安全保密级别,所以,我们只需对那些涉及机密数据的交互处理使用HTTPS协议。

2.CDN接入

HTTPS增加的延时主要是传输延时RTT,RTT的特点是节点越近延时越小,CDN天然离用户最近,因此选择使用CDN作为HTTPS接入的入口,将能够极大减少接入延时。CDN节点通过和业务服务器维持长连接、会话复用和链路质量优化等可控方法,极大减少HTTPS带来的延时。

3.会话缓存

虽然前文提到HTTPS即使采用会话缓存也要至少1*RTT的延时,但是至少延时已经减少为原来的一半,明显的延时优化;同时,基于会话缓存建立的HTTPS连接不需要服务器使用RSA私钥解密获取Pre-master信息,可以省去CPU的消耗。如果业务访问连接集中,缓存命中率高,则HTTPS的接入能力讲明显提升。

4.硬件加速

为接入服务器安装专用的SSL硬件加速卡,作用类似GPU,释放CPU,能够具有更高的HTTPS接入能力且不影响业务程序的。测试某硬件加速卡单卡可以提供35k的解密能力,相当于175核CPU,至少相当于7台24核的服务器,考虑到接入服务器其它程序的开销,一张硬件卡可以实现接近10台服务器的接入能力。

5.远程解密

本地接入消耗过多的CPU资源,浪费了网卡和硬盘等资源,考虑将最消耗CPU资源的RSA解密计算任务转移到其它服务器,如此则可以充分发挥服务器的接入能力,充分利用带宽与网卡资源。远程解密服务器可以选择CPU负载较低的机器充当,实现机器资源复用,也可以是专门优化的高计算性能的服务器。当前也是CDN用于大规模HTTPS接入的解决方案之一。

6.SPDY/HTTP2

前面的方法分别从减少传输延时和单机负载的方法提高HTTPS接入性能,但是方法都基于不改变HTTP协议的基础上提出的优化方法,SPDY/HTTP2利用TLS/SSL带来的优势,通过修改协议的方法来提升HTTPS的性能,提高下载速度等。

五、对前端的影响

5.1、作用

1.加密数据

你的网站如果有登录这种东西的话建议尽量使用https做,这样可以保证用户名、密码不被截获。咱们平时使用的post请求中所带的用户名密码等,非常容易被获取到。

2.反劫持

别以为劫持只是在你的网页里面插一些小广告,既然连广告都插得了,插一些js把你的cookie传到自己服务器上,也不是什么难事儿。亦或者做个钓鱼网页,让用户输入用户名和密码,也是非常容易的。所以,劫持是一件非常恐怖的事情。我们使用了https进行加密的话,则可以在大部分情况下规避这种危害。https加密后,中间商们无法再随意向加过密的html内容中插入的自己的代码了。

3.SEO

其实谷歌对于https的网站,搜索结果会给予更高的排名。国内的话,主要还是使用百度搜索引擎,但是百度搜索引擎目前只收录少部分的https网页,目前百度不主动抓取https页面(不了解)。所以,如果是国内网站需要做seo的话,建议每张网页都提供http/https两种版本的访问方式。或者主页面、需要被抓取的页面使用http方式,而登录等功能采用https方式。

5.2、问题

1.HTTP资源无法加载

在https环境下,http协议的js/css/请求/iframe等资源是根本加载不进来的

所以,如果想要使用这些资源的话,需要把访问这些资源的方式,转换为https,我们称这种https页面中引用http资源的方式为"mix content"

2. HTTPS下不能调用HTTP的异步请求

如果在https的页面中使用http的ajax调用。会提示跨域的报错,很明显有违ip地址、端口、协议的跨域限制。

5.3、解决办法

1.相对地址

如果自己的静态服务器,两种协议均支持的话,则直接在引用资源的时候,去掉协议头,改为相对协议,如//xxx.com/a.js。这样,请求a.js这个资源的时候,浏览器会按照当前页面的协议,进行请求,这叫做-----"协议相对地址"

对协议在放进标签、js异步请求是都好用。但是当url的参数中需要加入url时,就不是很好用了。我们的“//”并没有成功,我们需要根据页面的情况加入协议,拼装成完整的url,我们怎么获取协议呢?其实浏览器为我们提供了这种API window.location.protocol

2.做个https代理

如果自己的资源服务,不支持https访问的话,我们可以采用代理的方式,来引入这些文件。最简单的方式就是使用nginx,将引入的静态文件均做个代理。也就是说,访问资源的时候,用的是咱们的代理地址,但是拿文件的时候,还是会去http的源地址去拿的。

3.使用HTTPS资源和HSTS

既然网站升级到了HTTPS,那么资源及接口也应该一起对应升级为HTTPS

如果用户在浏览器端,输入www.jd.com实际上,浏览器会默认将这个网址补全为http://www.jd.com而不是https://www.jd.com。于是乎,我们如果想让用户访问我们的https版本网站,还得将页面强行重定向(跳转)一下。这是一个比较耗时的操作。而且有些时候,还没等我们重定向网页呢,就被运营商给劫持了。这就需要HSTS,其实HSTS的做法比较简单,只要在用户访问网站的时候,响应头中加入Strict-Transport-Security这个头,浏览器接下来的访问就均会默认采用https的方式进行访问了。

六、参考文献

1. RSA算法原理(二)—— 阮一峰

2.前端静态文件如何应对HTTPS的到来——郭瑞

3.聊一聊HTTPS那些事儿——候医生

4. HTTP协议以及http与https的区别——飘来荡去的阿宅

5. SSL与TLS的区别以及介绍——hengstart

6. SSL延迟有多大——阮一峰

7.图解SSL协议——阮一峰

8.我也想来谈谈HTTPS——ThoughtWorks

9. HTTPS原理探讨——轩风阁

10. HTTPS 是如何保证安全的——Delton

11.HTTPS是如何工作的——Edgar

12.分析HTTPS和HTTP的区别——佳鱼的家