理解HTTPS

  1. HTTPS 简介
  2. HTTPS 解决了 HTTP 在安全性方面的哪些问题
  3. SSL,数字证书,签名,RSA
    1. 详细过程图

Monday, 25 September 2017
7:36 PM

文章围绕的问题:

  1. 如何解决窃听风险?
  2. 如何解决篡改风险?
  3. 如何解决冒充风险?
  4. 什么是数字证书?
  5. CA证书的验证
  6. 什么是签名?

HTTPS 简介

超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在1994年首次提出,随后扩展到互联网上。

wikipedia https
简单的图示
HTTPS

HTTP+加密+认证+完整性保护 = HTTPS.
通常,http直接和tcp通信。当使用ssl/tls时,则演变成先和ssl/tls通信,再由ssl/tls和tcp通讯,因此,https其实就是身披ssl/tls保护外衣的http.

HTTPS 四次握手的过程

  1. 客户端发出请求
    在这一步,客户端主要向服务器提供以下信息。
    (1) 支持的协议版本,比如TLS 1.0版。
    (2) 一个客户端生成的随机数,稍后用于生成”对话密钥”。
    (3) 支持的加密方法,比如RSA公钥加密。
    (4) 支持的压缩方法。

  2. 服务器回应
    服务器收到客户端请求后,向客户端发出回应,这叫severHello.包含如下内容
    (1)确认使用的加密通信协议版本
    (2)一个服务器生成的随机数
    (3)确认使用的加密方法,比如RSA
    (4)服务器证书

  3. 客户端回应
    客户端验证证书,如果证书没有问题,客户端就会从证书中取出服务器的public-key。向服务器发送下面三项消息。
    (1)一个随机数。该随机数用服务器public-key加密,防止被窃听
    (2)编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
    (3)客户端握手结束通知,表示客户端的握手阶段已经结束。这一项也是前面发送的所有内容的hash值,用来供服务器校检。

  4. 服务器的最后回应
    服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的“会话密钥”。然后向客户端最后发送下面消息。
    (1)编码改变通知。表示随后的信息都将用双方商定的加密方法和密钥发送。
    (2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash, 用来供服务器校检。

HTTPS 解决了 HTTP 在安全性方面的哪些问题

HTTP 通信的风险

  1. 窃听风险:第三方可以获知通信内容
  2. 篡改风险:第三方可以修改通信内容
  3. 冒充风险:第三方可以冒充他人身份参与通信

如何解决这些风险? SSL/TSL 协议

  1. 加密传播,第三方无法窃听
  2. 具有校验机制,一旦被篡改,通信双方会立刻发现

SSL/TSL协议有两个问题

  1. 如何保证public-key不被篡改?

    • 可信任的第三方认证证书,证书中有public-key
    • 那如何保证证书的可信任性?
  2. publick-key计算量太大,如何减少耗用的时间?

    • 解决方法:每一次对话(session),客户端和服务器端都生成一个”对话密钥”(session key),用它来加密信息。由于”对话密钥”是对称加密,所以运算速度非常快,而服务器公钥只用于加密”对话密钥”本身,这样就减少了加密运算的消耗时间。

上面对HTTPS的介绍 看不懂没关系,下面来了解一些相关的概念

SSL,数字证书,签名,RSA

SSL/TLS协议的基本过程
(1)客户端向服务器索要并验证public-key
(2) 双方协商生成“对话密钥”
(3)双方采用“对话密钥”进行加密通信

如何验证数字证书?

  1. 读取证书发布机构
  2. 在操作系统中受信任的发布机构中查找
  3. 从证书中取出publick-key对证书的指纹和指纹算法用这个public-key进行解密,然后用这个指纹算法计算证书指纹,然后与证书中的指纹进行对比。
  4. 如果一致,说明证书是CA发布的

证书如何证明服务器身份
在使用证书之前,通信中,可能出现对方的身份无法确定。
使用证书之后,CA是可信的,通过对证书进行校检,确认证书的合法性,证书合法后,则

  1. 客户端向服务器发送随机字符串
  2. 服务器加密
  3. 客户端用证书中的public-key解密,结果一致,则可以证明服务器是证书上的服务器。

RSA
RSA是一种公钥密码体制
RSA密码体制是一种公钥密码体制,公钥公开,私钥保密,它的加密解密算法是公开的。 由公钥加密的内容可以并且只能由私钥进行解密,并且由私钥加密的内容可以并且只能由公钥进行解密。也就是说,RSA的这一对公钥、私钥都可以用来加密和解密,并且一方加密的内容可以由并且只能由对方进行解密。

重点:自己保留private-key, 只有private-key加密的内容,才能用public-key解密,这是保证别人无法伪造private-key持有者的重要保障。也就是说,是无法伪造RSA加密后内容的。

RSA加密算法在通信过程中起到的作用主要有两个:

  1. 因为私钥只有“服务器”拥有,因此“客户”可以通过判断对方是否有私钥来判断对方是否是“服务器”
  2. 客户端通过RSA的掩护,安全的和服务器商量好一个对称加密算法和密钥来保证后面通信过程内容的安全。

    签名
    签名就是在信息的后面再加上一段内容,可以证明信息没有修改过。
    一般对信息进行hash计算得到一个hash值。在把信息发送时,把签名和签名算法一起发送出去。接收方在接受信息后,用签名算法计算hash值,与签名进行比较。

数字证书
数字证书简称CA,它由权威机构给某网站颁发的一种认可凭证,这个凭证是被大家(浏览器)所认可的
为什么需要数字证书?
避免他人冒充服务器

中间人攻击

数字证书一般由证书认证机构颁发,证书里面包含了真实服务器的public-key和网站的其他信息,数字证书机构用自己的private-key加密后发给浏览器,浏览器使用数字证书机构的publick-key揭秘后得到真实服务器的publick-key。

为什么一定要用三个随机数,来生成”会话密钥”

至于为什么一定要用三个随机数,来生成”会话密钥”,dog250解释得很好:
“不管是客户端还是服务器,都需要随机数,这样生成的密钥才不会每次都一样。由于SSL协议中证书是静态的,因此十分有必要引入一种随机因素来保证协商出来的密钥的随机性。
对于RSA密钥交换算法来说,pre-master-key本身就是一个随机数,再加上hello消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥。
pre master的存在在于SSL协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么pre master secret就有可能被猜出来,那么仅适用pre master secret作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上pre master secret三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一。”

详细过程图

https_detail
注 :

  1. 双方都进行hash验证
    • 服务端知道hash是否正确后,需要让客户端知道自己是否验证正确,客户端也需要验证一次hash,避免服务器造假。
  2. D是最后HTTP使用的密钥

    参考文章
    • SSL/TLS协议运行机制的概述 http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
    • 图解SSL http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html
    • 数字证书 https://blog.cnbluebox.com/blog/2014/03/24/shu-zi-zheng-shu/
    • 数字证书原理 http://blog.sae.sina.com.cn/archives/4939
    • 图解HTTPS http://www.jianshu.com/p/51cc23843756

script>