HTTPS详细解析

一、 什么是HTTPS?算法

HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)安全超文本传输协议,能够理解为HTTP+SSL/TLS,简单来讲它是HTTP的安全版。浏览器


HTTP 协议定义了一套规范,让客户端或浏览器能够和服务器正常通讯,完成数据传输,可是HTTP协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险。安全

TLS(Transport Layer Security 传输层安全)/SSL (Secure Sockets Layer安全套接层), 是介于传输层【TCP】和应用层【HTTP】 之间的一层安全协议,TLS/SSL 具备身份验证、信息加密和完整性校验的功能,目的是保障客户端到服务端之间链接的安全性。服务器

SSL/TLS介于应用层和传输层之间,而且分为握手层和记录层。dom

  • 握手层:端与端之间协商密码套件、链接状态。
  • 记录层:对数据封装,数据交给传输层以前,会通过分片-压缩-认证-加密。

二、  TLS/SSL历史函数

  • 1994年,NetScape公司设计了SSL协议(Secure Sockets Layer)的1.0版,可是未发布。
  • 1995年,NetScape公司发布SSL 2.0版,很快发现有严重漏洞。
  • 1996年,SSL 3.0版问世,获得大规模应用。
  • 1999年,互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS 1.0版。
  • 2006年和2008年,TLS进行了两次升级,分别为TLS 1.1版和TLS 1.2版。最新的变更是2011年TLS 1.2的修订版。

目前,应用最普遍的是TLS 1.2。工具

TLS 1.0一般被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。性能

三、  HTTPS原理网站

HTTPS 协议的主要功能基本都依赖于 TLS/SSL 协议,TLS/SSL 的功能实现主要依赖于三类基本算法:散列函数 、对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。编码

  • 散列函数:常见的有 MD五、SHA一、SHA256,该类函数特色是函数单向不可逆、对输入很是敏感、输出长度固定,针对数据的任何修改都会改变散列函数的结果,用于防止信息篡改并验证数据的完整性;
  • 对称加密:常见的有 AES-CBC、DES、3DES、AES-GCM等,相同的密钥能够用于信息的加密和解密,掌握密钥才能获取信息,可以防止信息窃听,通讯方式是1对1;
  • 非对称加密:即常见的 RSA 算法,还包括 ECC、DH 等算法,算法特色是,密钥成对出现,通常称为公钥(公开)和私钥(保密),公钥加密的信息只能私钥解开,私钥加密的信息只能公钥解开。所以掌握公钥的不一样客户端之间不能互相解密信息,只能和掌握私钥的服务器进行加密通讯,服务器能够实现1对多的通讯,客户端也能够用来验证掌握私钥的服务器身份。

在信息传输过程当中,散列函数不能单独实现信息防篡改,由于明文传输,中间人能够修改信息以后从新计算信息摘要,所以须要对传输的信息以及信息摘要进行加密;

对称加密须要共享相同的密码,密码的安全是保证信息安全的基础,服务器和多 个客户端通讯,须要维持多个密码记录,且缺乏修改密码的机制;

非对称加密的特色是信息传输一对多,服务器只须要维持一个私钥就可以和多个客户端进行加密通讯,但服务器发出的信息可以被全部的客户端解密,且该算法的计算复杂,加密速度慢。

结合三类算法的特色,TLS 的基本工做方式是,客户端使用非对称加密与服务器进行通讯,实现身份验证并协商对称加密使用的密钥,而后对称加密算法采用协商密钥对信息以及信息摘要进行加密通讯,不一样的节点之间采用的对称密钥不一样,从而能够保证信息只能通讯双方获取。

四、  HTTPS演化

  • 窃听风险:黑客能够嗅探通讯内容。
  • 篡改风险:黑客能够修改通讯内容。
  • 冒充风险:黑客能够冒充他人身份参与通讯。

第一步:对称加密

对称加密算法的特色是加密和解密是使用同一个密钥,加解密速度快,典型的对称加密算法有DES、AES等。使用对称加密,客户端和服务端双方拥有相同的密钥,信息获得安全传输。

此种方式的缺点是:

  • 客户端、服务器双方都须要维护大量的密钥,维护成本很高;
  • 因每一个客户端、服务器的安全级别不一样,密钥容易泄露;

第二步:非对称加密

非对称加密算法的特色加密和解密分别使用不一样的密钥, 相对来讲加解密速度较慢,典型的非对称加密算法有RSA、DSA等。客户端用公钥对请求内容加密,服务器使用私钥对内容解密,反之亦然。

此种方式的缺点是:

  • 公钥是公开的,因此针对私钥加密的信息,黑客截获后可使用公钥进行解密,获取其中的内容;
  • 公钥并不包含服务器的信息,使用非对称加密算法没法确保服务器身份的合法性,存在中间人攻击的风险,服务器发送给客户端的公钥可能在传送过程当中被中间人截获并篡改;
  • 使用非对称加密在数据加密解密过程须要消耗必定时间,下降了数据传输效率;

  1. 客户端C和服务器S进行通讯,中间节点M截获了两者的通讯;
  2. 节点M本身计算产生一对公钥pub_M和私钥 pri_M;
  3. C向S请求公钥时,M把本身的公钥pub_M发给了C;
  4.  C 使用公钥pub_M加密的数据可以被M解密,由于M掌握对应的私钥 pri_M,而 C 没法根据公钥信息判断服务器的身份,从而 C 和 M 之间创建了“可信”加密链接;
  5. 中间节点 M 和服务器S之间再创建合法的链接,所以 C 和 S 之间通讯被M彻底掌握,M 能够进行信息的窃听、篡改等操做。

第三步:非对称加密+对称加密

如上图所示

(1)第③ 步时,客户端向服务端发送对称加密算法和对称密钥用公钥进行加密后发给服务器;

(2)服务器收到信息后,用私钥解密,提取出对称加密算法和对称密钥后,用客户端约定的对称密钥加密。

遇到的问题:

(1)客户端如何得到公钥;

(2)如何确认服务器身份。

第四步:非对称加密+对称加密+SSL证书

2、SSL证书

一、 证书做用

  • 服务器身份验证;
  • 传输服务端公钥;

二、 证书内容

数字证书是一个电子文档,其中包含了持有者的信息、公钥以及证实该证书有效的数字签名。

X.509 是一种数字证书标准,主要定义了证书中应该包含哪些内容,主要字段以下:

  • 对象名称(Subject Name)– 用于识别该数字证书的信息
  • 共有名称(Common Name)– 对于客户证书,一般是相应的域名
  • 证书颁发者(Issuer Name)– 发布并签署该证书的实体的信息
  • 签名算法(Signature Algorithm)– 签名所使用的算法
  • 序列号(Serial Number)– CA给证书的惟一整数,一个数字证书一个序列号
  • 生效期(Not Valid Before)
  • 失效期(Not Valid After)
  • 公钥(Public Key)

三、  编码格式

数字证书目前主要有如下几种编码格式:

  • PEM:最多见的数字证书编码,以 -----BEGIN xxx----- 开头,以 -----END xxx----- 结尾,主体部分使用 BASE64 对 ASCII 进行编码。能够储存SSL证书([xxx]为CERTIFICATE)和私钥[xxx]为PRIVATE KEY),也能够储存二者的联合。扩展名一般为:.pem .key .csr .cer .crt。主要使用在Linux/Unix操做系统中。
  • DER:二进制编码格式,能够储存任何类型的证书和私钥,不可读。扩展名一般为:.der .key .csr .cer .crt。Windows 系统 及 Java 平台倾向于使用这一编码格式。
  • P7B:P7B格式证书是Base64 ASCII编码,一般证书后缀是.p7b 或 .p7c, P7B证书正常是以-----BEGIN PKCS7----- 开头,并以 -----END PKCS7----- 结束, P7B 格式的证书仅包含服务器证书和中级证书,不包含密钥。 Windows 和 Java Tomcat支持P7B格式。
  • PFX:二进制形式存储证书,一般服务器证书、中级证书以及密钥包含在一个加密文件里面,常见的后缀是.pfx或.p12 ,一般咱们在Windows平台导入和导出证书以及密钥就是使用pfx格式的证书。

四、  CA

CA(Certificate Authority)是数字证书认证机构的简称,是指发放、管理、废除数字证书的机构。CA的做用是检查证书持有者身份的合法性,并签发证书,以防证书被伪造或篡改,以及对证书和密钥进行管理。在数字证书认证的过程当中,CA做为权威的、公正的、可信赖的第三方,其做用是相当重要的。世界上的根 CA 就那么几家,浏览器或者操做系统在出厂的时候,已经内置了这些机构的自签名证书,上面记录他们的公钥信息,其中TOP5是Symantec、Comodo、Godaddy、GolbalSign 和 Digicert。你也能够在须要的时候手动安装 CA 证书。

五、  建立证书
C:\Users\smile\Desktop\未命名文件.png

  • 生成密钥:生成一对公钥,私钥用于HTTPS身份认证和密钥协商,公钥用户建立建立证书签名请求(CSR);
  • 建立CSR:CSR是为申请服务器证书而发送至CA的文件,简单的说就是一个未签名的SSL证书。生成CSR信息须要提供网站公钥以及X.509证书所要求的其余字段,包括国家(中国添CN)、省份、所在城市、单位名称、单位部门名称、电子邮件等信息;
  • CA签名:CA收到CSR请求以后,经过等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的全部权等,验证经过后,使用CA私钥给CSR签名,签名后的文件就是SSL证书;

六、  证书校验

  • 读取证书中的相关的明文信息,采用相同的散列函数计算获得信息摘要,而后,利用对应 CA 的公钥解密签名数据,对比证书的信息摘要,若是一致,则能够确认证书的合法性,即公钥合法;
  • 验证证书链的可信性,客户端会内置的信任 CA 的公钥解密证书数字签名,若是CA不被信任,则找不到对应 CA 的证书,证书也会被断定非法。
  • 验证证书相关的域名信息是否与当前的访问域名匹配;
  • 验证证书是否在有效期内;
  • 验证证书是否吊销或者进入黑名单,有两类方式离线 CRL 与在线 OCSP,不一样的客户端行为会不一样;

七、  证书链

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

http://upload-images.jianshu.io/upload_images/2203779-f4cb35fb034f48e0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

优点:

  • 减小根证书结构的管理工做量,能够更高效的进行证书的审核与签发;根证书通常内置在客户端中,私钥通常离线存储,一旦私钥泄露,则吊销过程很是困难,没法及时补救;
  • 中间证书结构的私钥泄露,则能够快速在线吊销,并从新为用户签发新的证书;
  • 证书链四级之内通常不会对 HTTPS 的性能形成明显影响。

3、会话过程

SSL/TSL握手的做用是身份验证和协商密钥。密钥交换是为了在不安全数据通道中产生一个只有通讯双方知道的对称加密 Session Key。身份认证的目的是确保链接到拥有网站私钥的合法服务器。
http://s3.51cto.com/wyfs02/M00/96/B8/wKioL1kk7hWRBFuoAACyEXCJ6lI975.jpg

TLS/SSL握手主要过程以下:

一、ClientHello

在握手流程中,ClientHello是第一个请求,将客户端的参数传送给服务器。主要请求参数包含:

  • 客户端支持的SSL/TLS协议版本列表,好比TLS 1.2;
  • 客户端支持的加密套件(Support Ciphers)列表;
  • 客户端生成的随机数(Client random),稍后用于生成对称加密密钥。

http://s2.51cto.com/wyfs02/M02/96/B8/wKioL1kk6eqhhq7UAAEONjCBo_A772.jpg

二、 SeverHello

服务端收到ClientHello请求后,确认双方加密套件、压缩方法等会话参数,并返回给客户端。SeverHello消息的结构与ClientHello相似,只是每一个字段只包含一个选项。服务器的加密组件内容以及压缩方法等都是从接收到的客户端加密组件内筛选出来的。

http://s3.51cto.com/wyfs02/M01/96/B7/wKiom1kk6fuD7bnuAACtgcvWiaE285.jpg

三、Certificate

服务器返回HTTPS数字证书报文。

http://s1.51cto.com/wyfs02/M02/96/B7/wKiom1kk6gzRNV8aAADthqopNrk298.jpg

四、ServerKeyExchange

ServerKeyExchange包含了服务端为密钥交换的提供的数据。对于不一样的协商算法套件会存在差别。某些加密套件不须要服务器返回发送ServerKeyExchange消息。

http://s4.51cto.com/wyfs02/M02/96/B7/wKiom1kk6yaj3XO9AAC1IwIymEE951.jpg

五、ServerHelloDone

ServerHelloDone消息代表服务器已经将全部预计的握手消息发送完毕。在此以后,服务器会等待客户端发送消息。

http://s5.51cto.com/wyfs02/M00/96/B8/wKioL1kk6zmz1ahWAABiWWpdRyI712.jpg

六、ClientKeyExchange

ClientKeyExchange包含客户端为密钥交换提供的数据。这个消息受协商的密码套件的影响,内容随着不一样的协商密码套件而不一样。

http://s1.51cto.com/wyfs02/M01/96/B8/wKioL1kk7kLA1tgdAACdq5aXG0g399.jpg

七、ChangeCipherSpec

ChangeCipherSpec消息代表发送端已取得用以生成链接参数的足够信息,已生成加密密钥,而且将切换到加密模式。客户端和服务器在条件成熟时都会发送这个消息。注意:ChangeCipherSpec不属于握手消息,它是另外一种协议,只有一条消息,做为它的子协议进行实现。

http://s1.51cto.com/wyfs02/M00/96/B8/wKiom1kk7i3gDwdFAABRvJOWYEU101.jpg

八、Finished

Finished消息意味着握手已经完成。接下来,客户端与服务器进入加密通讯,就彻底是使用普通的HTTP协议,只不过用”会话密钥”加密内容。

4、密钥协商

密钥交换的过程,是通讯双方协商一个公共密钥的过程,该过程的输出是一个密钥,用于接下来的客户端和服务端之间的通讯加解密。考虑到因特网能够被窃听,须要一个算法来保护这个协商过程,确保只有客户端和服务端知道协商的结果。密钥交换算法通常经常使用的有RSA和DH,SSLV3.0一下版本只支持RSA密钥交换方式;

一、RSA密钥交换

http://image.beekka.com/blog/2014/bg2014092003.png

RSA密钥交换抓包分析

http://dl2.iteye.com/upload/attachment/0122/0727/0d89f8eb-df53-3b68-8884-15d515f9b34e.png

一、Client Hello
http://dl2.iteye.com/upload/attachment/0122/0709/5d3288f5-5e8a-3fe2-a358-f9358d45647d.png

二、Server Hello 
http://dl2.iteye.com/upload/attachment/0122/0711/a3dd155d-f756-31a9-92ca-b126afd052ef.png

三、Certificate
http://dl2.iteye.com/upload/attachment/0122/0713/cc387b9d-af07-360f-a3d3-fd06748db526.png

四、Server Hello Done 
http://dl2.iteye.com/upload/attachment/0122/0715/15522bea-722f-373c-a584-64866f174b3f.png

五、Client Key Exchange
http://dl2.iteye.com/upload/attachment/0122/0717/74468a2e-74c0-3082-af33-a523c1d8643d.png

六、Chage cipher spec
http://dl2.iteye.com/upload/attachment/0122/0719/8ddcd8ad-a5d5-39e4-8011-a57a921937d9.png

七、Encrypted Handshake Message
http://dl2.iteye.com/upload/attachment/0122/0721/8cacf376-2815-3742-980f-bd60360c2da7.png

八、 Change cipher spec
http://dl2.iteye.com/upload/attachment/0122/0723/a566e850-2a69-3166-ad84-0ea897692885.png

九、Encryted Handshake Message
http://dl2.iteye.com/upload/attachment/0122/0725/c5b8e130-867a-34d3-aa95-00bb88e41df3.png

二、DH密钥交换

1976年,美国的两位数学家Whitfield DiffieMartin Hellman率先发表了一种解决该密钥传输的方法,所以这种方法被你们称为Diffie–Hellman key exchange算法,这种算法提出这么一个作法:“在加密通信以前双方各自生成密码的一部分,而后互换后合成起来,做为最终的密码”。

维基百科上使用了一个颇有趣的比喻,就是颜料的混合:设想这样一个场景,Alice(A)和Bob(B),他们想在不见面的状况下秘密约定出一种颜色,但他们互相沟通的信息都会被公开,应该怎么办呢?

秘密在于,颜色混合是一种“不可逆”的操做,当双方交换颜色时,尽管咱们知道他们交换的颜色都是由一份黄色和另外一份其余颜色混合获得的,但咱们仍是没法或者很可贵到他们的私密颜色。

DH秘钥交换的原理很是类似,也是利用了数学上的一个“不可逆”的运算,就是离散对数(Discrete logarithm

http://image.beekka.com/blog/2014/bg2014092007.png

DH密钥交换抓包分析

http://dl2.iteye.com/upload/attachment/0122/0964/de9ec5a7-6e89-36cf-a096-5304bb4e010b.png

SSL握手第一阶段:

一、Client Hello 
http://dl2.iteye.com/upload/attachment/0122/0944/eafadff7-5735-36a9-9200-ba7a552f40bf.png

二、Server Hello 
http://dl2.iteye.com/upload/attachment/0122/0946/8794ef66-2b63-37c5-ad37-6b9f5516b8c4.png

SSL握手第二阶段:

三、Certficate
http://dl2.iteye.com/upload/attachment/0122/0948/e0f07c0f-9b6a-3b26-b53e-f922a484814a.png

四、Server Key Exchange
http://dl2.iteye.com/upload/attachment/0122/0950/8c0eaf2d-d920-3fe7-a705-019b895ed476.png

五、Server Hello Done
http://dl2.iteye.com/upload/attachment/0122/0956/b0cd421f-d3c5-3e44-8f57-cc742f8a95c7.png

SSL握手第三阶段:

六、Client Key Exchange 
http://dl2.iteye.com/upload/attachment/0122/0952/e26db917-0cc5-3030-a336-be78c4c6b0de.png

七、Change Cipher spec 
http://dl2.iteye.com/upload/attachment/0122/0954/30c110f6-c3d7-3ad7-98b6-ea72884a05e7.png

八、Encrypted Handshake Message 
http://dl2.iteye.com/upload/attachment/0122/0958/43f90ec0-6e04-33e5-a636-eb44801df011.png

SSL握手第四阶段:

九、Change Cipher spec
http://dl2.iteye.com/upload/attachment/0122/0960/8661738d-0030-3414-81ad-faf08dc80112.png

十、Encrypted Handshake Message
http://dl2.iteye.com/upload/attachment/0122/0962/fc328d2e-3df1-3b56-aa8d-f3745945a0e2.png

5、HTTPS安全

一、SSL证书欺骗攻击(SSLSniff

此类攻击较为简单常见。首先经过ARP欺骗、DNS劫持甚至网关劫持等等,将客户端的访问重定向到攻击者的机器,让客户端机器与攻击者机器创建HTTPS链接(使用伪造证书),而攻击者机器再跟服务端链接。

这样用户在客户端看到的是相同域名的网站,但浏览器会提示证书不可信,用户不点击继续浏览就能避免被劫持的。因此这是最简单的攻击方式,也是最容易识别的攻击方式。

此类攻击有个经典的工具:SSLSniff。

二、SSL剥离攻击(SSLStrip

SSL剥离,即将HTTPS链接降级到HTTP链接。假如客户端直接访问HTTPS的URL,攻击者是没办法直接进行降级的,由于HTTPS与HTTP虽然都是TCP链接,但HTTPS在传输HTTP数据以前,须要在进行了SSL握手,并协商传输密钥用来后续的加密传输;假如客户端与攻击者进行SSL握手,而攻击者没法提供可信任的证书来让客户端验证经过进行链接,因此客户端的系统会判断为SSL握手失败,断开链接。

该攻击方式主要是利用用户并不会每次都直接在浏览器上输入https://xxx.xxx.com来访问网站,或者有些网站并不是全网HTTPS,而是只在须要进行敏感数据传输时才使用HTTPS的漏洞。中间人攻击者在劫持了客户端与服务端的HTTP会话后,将HTTP页面里面全部的https://超连接都换成http://,用户在点击相应的连接时,是使用HTTP协议来进行访问;这样,就算服务器对相应的URL只支持HTTPS连接,但中间人同样能够和服务创建HTTPS链接以后,将数据使用HTTP协议转发给客户端,实现会话劫持。