https及https调优

1 HTTPS

1.1 HTTPS简介

  超文本传输安全协议(英语:HyperText Transfer Protocol Secure,缩写:HTTPS;常称为HTTP over TLS、HTTP over SSL或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在1994年首次提出,随后扩展到互联网上。历史上,HTTPS连接经常用于万维网上的交易支付和企业信息系统中敏感信息的传输。在2000年代末至2010年代初,HTTPS开始广泛使用,以确保各类型的网页真实,保护账户和保持用户通信,身份和网络浏览的私密性。另外,还有一种安全超文本传输协议(S-HTTP)的HTTP安全传输实现,但是HTTPS的广泛应用而成为事实上的HTTP安全传输实现,S-HTTP并没有得到广泛支持。

 emsp;现如今一般网址的前缀便可以看出该网站支持的协议类型分别为http:\\https:\\

1.2 HTTPS和HTTP的区别

  HTTP是一种超文本传输协议,其在网络中传输数据是通过明文进行传输,如果应用程序未对数据进行加密处理,则任何人都可以通过监听或者中间人攻击之类的技术手段查看其内容。HTTPS是在HTTP的基础上对数据进行加密。

  1. https协议需要向CA申请证书,一般免费的证书比较少,需要一定的费用,而HTTP只是一种协议可以随意使用,免费;
  2. http传输的是明文,https传输的是加密过的数据;
  3. http和https使用的连接方式和端口不同,前者是80,后者是443;
  4. http是无状态连接,https协议是由SSL+Http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

https及https调优_第1张图片

1.3 HTTPS的工作原理

  在协议栈中http和https都属于应用层,都是基于传输层的TCP协议实现的,https实在http的基础上添加了一层SSL/TLS。
https及https调优_第2张图片

1.3.1 TLS

1.3.1.1 TLS简介

  传输层安全性协议(英语:Transport Layer Security,缩写:TLS)及其前身安全套接层(英语:Secure Sockets Layer,缩写:SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。网景公司(Netscape)在1994年推出首版网页浏览器-网景导航者时,推出HTTPS协议,以SSL进行加密,这是SSL的起源。IETF将SSL进行标准化,1999年公布TLS 1.0标准文件(RFC 2246)。随后又公布TLS 1.1(RFC 4346,2006年)、TLS 1.2(RFC 5246,2008年)和TLS 1.3(RFC 8446,2018年)。在浏览器、电子邮件、即时通信、VoIP、网络传真等应用程序中,广泛使用这个协议。许多网站,如Google、Facebook、Wikipedia等也以这个协议来创建安全连线,发送数据。目前已成为互联网上保密通信的工业标准。

1.3.1.2 TLS握手

  TLS协议采用主从式架构模型,用于在两个应用程序间透过网络创建起安全的连线,防止在交换数据时受到窃听及篡改。

  TLS协议的优势是与高层的应用层协议(如HTTP、FTP、Telnet等)无耦合。应用层协议能透明地运行在TLS协议之上,由TLS协议进行创建加密信道需要的协商和认证。应用层协议传送的数据在通过TLS协议时都会被加密,从而保证通信的私密性。TLS协议是可选的,必须配置客户端和服务器才能使用。主要有两种方式实现这一目标:一个是使用统一的TLS协议端口(例如:用于HTTPS的端口443);另一个是客户端请求服务器连接到TLS时使用特定的协议机制(例如:电子邮件常用的STARTTLS)。一旦客户端和服务器都同意使用TLS协议,他们通过使用一个握手过程协商出一个有状态的连接以传输数据[1]。通过握手,客户端和服务器协商各种参数用于创建安全连接。

  握手过程如下:

  1. 客户端连接到支持TLS协议的服务器通过TCP要求创立链接,最先是最基本的TCP三次握手过程;
  2. 在三次握手的第三次客户端会向服务提提供自身支持的TLS版本、TLS选项、密码包(加密算法,散列算法等)等;
  3. 服务器从客户端提供的密码包列表中选择一个密码包通知客户端,并发送服务器经过CA认证的数字证书、公钥;
  4. 客户端确认其证书有效性,使用服务器的公钥和协商的加密套件加密一个对称密钥(通过随机数生成),该密钥只能通过服务器的私钥解密;
  5. 服务器使用私钥解密出对称密钥后发送加密的Finish消息,表明握手完成。

https及https调优_第3张图片

  可以明显的看到,TLS的我收过程比较复杂。

1.3.1.3 TLS加密

  从上面的握手过程中可以看到,整个过程使用到了两种加密方式:非对称加密和对称加密。

  非对称加密:
  非对称加密:非对称加密也称公开密钥密码,是密码学的一种算法,分别需要公钥和私钥两个密钥,公钥用于加密,私钥用于解密,因为加密和解密的密钥不同,因此称之为非对称加密。其公钥可以公开,可任意向外发布;私钥不可以公开,必须由用户自行严格秘密保管,绝不透过任何途径向任何人提供,也不会透露给被信任的要通信的另一方。
  常见的非对称加密算法有:RSA、ElGamal、DS、ECDSA、ECC等,其中RSA使用最为广泛。另外多说一句:RSA需要解决的问题是大整数因数分解。

  对称加密
  对称加密:对称加密在加密和解密过程中使用相同的密钥,与公开密钥加密相比,要求双方获取相同的密钥是对称密钥加密的主要缺点之一。
  常见的对称加密算法有:AES、DES、ChaCha20等。

  对称加密和非对称加密的不同

  1. 对称加密加密解密速度快,非对称加密解密速度慢;
  2. 对称加密安全性不高,非对称加密安全性高;
  3. 对称加密密钥管理不方便,非对称加密密钥管理方便。

  因此TLS通过融合对称加密和非对称加密的优缺点:使用对称加密加密数据,使用非对称加密进行对称加密的密钥交换。从握手过程中可以看到发生在过程4和5。

https及https调优_第4张图片

1.4 HTTPS的优缺点

  优点

  1. HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性;
  2. HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本;

  缺点

  1. HTTPS并不能防止站点被网络爬虫抓取。在某些情形中,被加密资源的URL可仅通过截获请求和响应的大小推得,这就可使攻击者同时知道明文(公开的静态内容)和密文(被加密过的明文),从而使选择密文攻击成为可能;
  2. 因为SSL在HTTP之下工作,对上层协议一无所知,所以SSL服务器只能为一个IP地址/端口组合提供一个证书。这就意味着在大部分情况下,使用HTTPS的同时支持基于名字的虚拟主机是不很现实的;
  3. 证书通常并不是免费的;
  4. HTTPS中握手过程繁琐,数据需要经过加密,响应速度不如HTTP;
  5. SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗;
  6. HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行。

2 HTTPS调优

 由于TLS繁琐的握手和加密过程导致HTTPS的性能不佳,如何调优tls提升https的服务响应是必要的。HTTPS协议包含HTTP、TCP和TLS三部分,因此调优也是从三部分入手。

2.1 HTTP

  HTTP协议有两个版本HTTP1.0和HTTP2.0。HTTP2.0是针对HTTP1.0的缺陷设计出的高响应版本。
  HTTP1.0的缺陷:

  1. 每个请求都需要建立单独链接,无法保持长连接;
  2. 每个请求和响应都需要完整的head信息;
  3. 数据未加密。

  相比而言,HTTP2.0的优点:

  1. 支持多路复用,可以通过单个链接发起多重请求-响应消息,而不是维护多个TCP链接;
  2. 二进制分帧,在兼容HTTP1.0的基础上添加了一个二进制分帧层,改进传输性能,实现低延迟和高吞吐量;
  3. 首部压缩,HTTP2.0通过HPACK算法对首部进行压缩;
  4. 服务端推送,服务端推送是一种在客户端请求之前发送数据的机制,服务端主动把客户端可能需要的资源推送给客户端,而不是需要客户端主动请求;

  因此在协议选择上选择HTTP2.0相比于HTTP1.0性能上更好。

2.2 TCP

  由于TCP拥塞控制算法中的慢启动算法,导致刚开始建立链接的cwnd窗口很小,HTTP的数据包可能被拆分为多个小数据包,而小数据包在网络中传输到达需要再进行重组无疑增加了开销,可以通过修改慢启动的初始窗口值,但是这一步需要考虑到目标网络的状况,需要根据实际的网络状况调整。

  TCP链接会在当前链接几乎没有任何流量的时候减小cwnd,开启慢启动算法,在服务端可以通过命令sysctl -w net.ipv4.tcp_slow_start_after_idle=0禁止空闲慢启动,也可以将其写入/etc/sysctl.conf使其永久有效。

  当然还可以调整TCP的其他参数调优TCP,详情见TCP参数调优详解

2.3 TLS

2.3.1 长连接

  HTTPS主要性能瓶颈之一是每个链接开始握手阶段,在资源数允许的情况下尽可能的保持每一个链接存活时间长。现在的趋势是使用事件驱动的 WEB 服务器,通过使用固定的线程池(甚至单个线程)处理所有通讯,从而减少每个连接的成本以及被攻击的可能性。长连接的缺点是在最后一个 HTTP 连接完成之后,服务器在关闭连接之前会等待一定时间,虽然一个连接不会消耗太多的资源,但是降低了服务器的总体伸缩性。长连接适用于客户端突发大量请求的场景。

2.3.2 密钥

  TLS中设计加密算法和密钥交换算法。
  如何选择非对称加密算法,对称加密算法,加密长度,密钥交换算法最好根据实际情况进行权衡。
  非对称加密算法常用的有RSA,ECDSA,ECDSA在性能和安全性上要优于 RSA,256位的 ECDSA (128位加密强度)提供和 3072位的 RSA 一样的安全性,却有更好地性能。
  目前有两种可用的密钥交换算法:DHE 和 ECDHE。其中 DHE 太慢不推荐使用。 密钥交换算法的性能取决于配置的协商参数长度。对于DHE,常用的1024和2048位,分别提供80和112位安全等级。椭圆曲线迪菲-赫尔曼金钥交换(英语:Elliptic Curve Diffie–Hellman key exchange,缩写为ECDH),是一种匿名的密钥合意协议(Key-agreement protocol),这是迪菲-赫尔曼密钥交换的变种,采用椭圆曲线密码学来加强性能与安全性。在这个协定下,双方利用由椭圆曲线密码学建立的公钥与私钥对,在一个不安全的通道中,建立起安全的共有加密资料。

2.3.3 证书

  一次完整的 TLS 握手期间,服务器会把它的证书链发送给客户端验证。证书链的长度和正确性对握手的性能有很大影响。

  1. 使用尽可能少的证书,证书链里的每个证书都会增大握手数据包,证书链中包含太多证书有可能导致 TCP 初始拥塞窗口溢出;
  2. 只包含必需的证书,证书链里包含非必需证书是个常见错误,每个这样的证书会给握手协议额外增加1-2KB;
  3. 提供完整的证书链,服务器必须提供一个被根证书信任的完整证书链;
  4. 使用椭圆曲线证书链,因为 ECDSA 私钥长度使用更少的位,所以 ECDSA 证书会更小;
  5. 避免同一张证书绑定过多域名,每增加一个域名都会增加证书的大小,对于大量域名来说会有明显的影响。

2.3.4 吊销检查

  虽然证书吊销状态在不断变化,并且用户代理对证书吊销的行为差异很大,但是作为服务器,要做的就是尽可能快地传递吊销信息。

  1. 使用OCSP,信息的证书 OCSP 被设计用于提供实时查询,允许用户代理只请求访问网站的吊销信息,查询简短而快速(一个HTTP请求)。相比之下 CRL 是一个包含大量被吊销证书的列表;
  2. 使用具有快速且可靠的 OCSP 响应程序的 CA,不同 CA 之间的 OCSP 响应程序性能不同,在你向 CA 提交之前先检查他们的历史 OCSP 响应程序。 另一个选择 CA 的标准是它更新 OCSP 响应程序的速度;
  3. 部署 OCSP stapling,OCSP stapling 是一种允许在 TLS 握手中包含吊销信息(整个OCSP响应)的协议功能。启用之后,通过给予用户代理进行吊销检查的全部信息以带来更好地性能,可以省去用户代理通过独立的连接获取 CA 的 OCSP 响应程序来查询吊销信息。

2.3.5 协议兼容和硬件加速

  如果你的服务器与一些新版本协议的特性(例如TLS 1.2)不兼容,浏览器可能需要通过与服务器进行多次尝试,才能协商一个加密的连接。确保良好的 TLS 性能的最好方式是升级最新的 TLS 协议栈以支持较新的协议版本和扩展。
  随着 CPU 速度的不断提高,基于软件的 TLS 实现在普通 CPU 上已经运行得足够快,无需专门的加密硬件就能处理大量的 HTTPS 请求。但安装加速卡或许能够提升速度。

2.4 CDN

  使用 CDN 可以实现世界级的性能,它利用地理上分散的服务器提供边缘缓存和流量优化。
  当用户离你的服务器越远,访问网络就越慢,在这种情况下连接建立是一个很大的限制因素。为了服务器尽可能靠近最终用户,CDN 经营着大量的地理分布的服务器,它可以提供两种降低延迟的方式,即边缘缓存和连接管理。

2.4.1 边缘缓存

  由于 CDN 服务器贴近用户,可以将你的文件提供给用户,就像你的服务器真的在那里一样。

2.4.2 连接管理

  如果你的内容是动态的、用户特定的,那么久无法通过 CDN 缓存数据。但是,一个不错的 CDN 即使没有任何缓存,也能通过连接管理提供帮助,那就是它可以通过长时间保持的长连接消除大部分建立连接的成本。
  建立连接期间大部分的时间都花在等待上面。为了尽量较少等待,CDN 通过自己的基础设置将流量路由到距离目的地最近的一个点。因为是 CDN 自己完全可控的服务器,它可以内部保持长连接很长一段时间。
  当使用 CDN 时,用户连接到最近的 CDN 节点,这只有很短的距离,TLS 握手的网络延迟也很短;而 CDN 与服务器之间可以直接复用已有的远距离长连接。这意味着与 CDN 快速初始 TLS 握手后,用户与服务器就建立了有效连接。

参考

维基-HTTPS
HTTPS加密(握手)过程
How does https works?
how https works
对称加密和非对称的加密 的优缺点和理解
维基-TLS
HTTP与HTTPS的区别
TCP参数调优详解
HTTP2.0与HTTP1.0的区别
HTTP2的优点
维基-ECDHE
HTTPS 之 TLS 性能调优

你可能感兴趣的:(基础知识)