TLS,SSL,HTTPS with Python(转)

From: 扫盲 HTTPS 和 SSL/TLS 协议[0]:引子html

须要了解的背景知识:node

  • 术语 HTTPS,SSL,TLS
  • 长链接与短链接的关系
  • 了解 CA 证书
  • 基本流程

一.术语扫盲

1.什么是SSL?

SSL(Secure Sockets Layer, 安全套接字),由于原先互联网上使用的 HTTP 协议是明文的,存在不少缺点——好比传输内容会被偷窥(嗅探)和篡改。发明 SSL 协议,就是为了解决这些问题。git

2.那么什么是TLS呢?

到了1999年,SSL 由于应用普遍,已经成为互联网上的事实标准。IETF 就在那年把 SSL 标准化。标准化以后的名称改成 TLS(是“Transport Layer Security”的缩写),中文叫作“传输层安全协议”。github

不少相关的文章都把这二者并列称呼(SSL/TLS),由于这二者能够视做同一个东西的不一样阶段。算法

3.那么什么是HTTPS呢?

HTTPS = HTTP + SSL/TLS, 也就是 HTTP over SSL 或 HTTP over TLS.这是后面加 S 的由来 浏览器

相对于HTTP:安全

  • http和https使用的是彻底不一样的链接方式,用的端口也不同,前者是80,后者是443。
  • http的链接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

二.长链接VS短链接

HTTP对TCP的链接使用分为:服务器

  • 短链接
  • 长链接(又称“持久链接”,或“Keep-Alive”或“Persistent Connection”)

若是是短链接的话,针对每一个HTML资源,就会针对每个外部资源,分别发起一个个 TCP 链接。相反,若是是“长链接”的方式,浏览器也会先发起一个 TCP 链接去抓取页面。可是抓取页面以后,该 TCP 链接并不会当即关闭,而是暂时先保持着(所谓的“Keep-Alive”)。而后浏览器分析 HTML 源码以后,发现有不少外部资源,就用刚才那个 TCP 链接去抓取此页面的外部资源。网络

注意:session

  • 在 HTTP 1.0 版本,【默认】使用的是“短链接”(那时候是 Web 诞生初期,网页相对简单,“短链接”的问题不大)
  • 在 HTTP 1.1 中,【默认】采用的是“Keep-Alive”的方式。

三.HTTPS的设计

HTTPS的设计要兼容HTTP

  • HTTPS 仍是要基于 TCP 来传输
  • 单独使用一个新的协议,把 HTTP 协议包裹起来(所谓的“HTTP over SSL”,其实是在原有的 HTTP 数据外面加了一层 SSL 的封装。HTTP 协议原有的 GET、POST 之类的机制,基本上原封不动)

关于HTTPS的性能,为了确保性能,SSL 的设计者至少要考虑以下几点:

  • 如何选择加密算法(“对称”or“非对称”)?
  • 如何兼顾 HTTP 采用的“短链接”TCP 方式?

四.简单运行过程

SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,而后用公钥加密信息,服务器收到密文后,用本身的私钥解密。

问题:

  • 如何保证公钥不被篡改?:解决方法:将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。
  • 公钥加密计算量太大,如何减小耗用的时间?解决方法:每一次对话(session),客户端和服务器端都生成一个”对话密钥”(session key),用它来加密信息。因为”对话密钥”是对称加密,因此运算速度很是快,而服务器公钥只用于加密”对话密钥”自己,这样就减小了加密运算的消耗时间。

所以,SSL/TLS协议的基本过程是这样的:

  • 客户端向服务器端索要并验证公钥。
  • 双方协商生成”对话密钥”。
  • 双方采用”对话密钥”进行加密通讯。

以下图解:

五.详解运行过程

以下图示:

注意的是,”握手阶段”的全部通讯都是明文的

1.客户端发出请求(ClientHello)

C向S提供信息以下:

  • 支持的协议版本,好比TLS 1.0版。
  • 一个客户端生成的随机数,稍后用于生成”对话密钥”。
  • 支持的加密方法,好比RSA公钥加密。
  • 支持的压缩方法。

2.服务器回应(SeverHello)

服务器收到客户端请求后,向客户端发出回应,这叫作SeverHello。服务器的回应包含如下内容。

  • 确认使用的加密通讯协议版本,好比TLS 1.0版本。若是浏览器与服务器支持的版本不一致,服务器关闭加密通讯。
  • 一个服务器生成的随机数,稍后用于生成”对话密钥”。
  • 确认使用的加密方法,好比RSA公钥加密。
  • 服务器证书。

除了上面这些信息,若是服务器须要确认客户端的身份,就会再包含一项请求,要求客户端提供”客户端证书”。

3.客户端回应

客户端收到服务器回应之后,首先验证服务器证书。若是证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已通过期,就会向访问者显示一个警告,由其选择是否还要继续通讯。

若是证书没有问题,客户端就会从证书中取出服务器的公钥。而后,向服务器发送下面三项信息。

  • 一个随机数。该随机数用服务器公钥加密,防止被窃听。
  • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
  • 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的全部内容的hash值,用来供服务器校验。

如今总共有3个随机数,第三个又称”pre-master key”,有了它之后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自 生成 本次会话 所用的 同一把 “会话密钥”。

4.服务器的最后回应

服务器收到客户端的第三个随机数pre-master key以后,计算生成本次会话所用的”会话密钥”。而后,向客户端最后发送下面信息。

  • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
  • 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的全部内容的hash值,用来供客户端校验。

至此,整个握手阶段所有结束。接下来,客户端与服务器进入加密通讯,就彻底是使用普通的HTTP协议,只不过用”会话密钥”加密内容。

六.Https的劣势

不完整总结以下:

  • 对数据进行加解密决定了它比http慢
  • https协议须要到CA申请证书。

七.Python操做SSL

首先建立证书

openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout key.pem 

实例代码在: ssl_demo

八.参考:

  • 聊聊HTTPS和SSL/TLS协议
  • 图解HTTPS
  • SSL/TLS协议运行机制的概述
相关文章
相关标签/搜索