The only thing I know is that I know nothing


Software Developer

HTTPS工作原理

本文目标

读完本文,能够明白

  • 什么是HTTPS、TLS(SSL),TLS和HTTPS的关系
  • 什么是数字证书及认证过程
  • 摘要、数字签名
  • 对称、非对称加密算法

HTTPS概述

HTTPS,也称作HTTP over TLS。就是在安全的传输层上发送的HTTP。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。

HTTPS方案

安全的HTTP是可选的。因此,对于Web服务器发起请求时,我们需要有一种方式来告知Web服务器去执行HTTP的安全协议版本。这是在URL的方案中实现的。 请求一个客户端对某个Web资源执行某事务,它会去检查URL的方案。

  • 如果URL的方案是HTTP,客户端就会打开一条到服务器端口80(默认)的连接,并发送老的HTTP指令。
  • 如果URL方案是HTTPS,客户端就会打开一条到服务器端口443(默认)的连接,然后与服务器握手,以二进制格式与服务器交换一些SSL安全参数,附上加密的HTTP命令。

安全传输过程

在HTTPS中,客户端首先会打开一条到Web服务器端口443的连接。一旦建立TCP连接,客户端和服务器就会初始化SSL层,对加密参数进行沟通,并交换密钥。握手完成后,SSL初始化就完成了,客户端就可以把请求报文发送给安全层了。在将这些报文发送给TCP之前,要先对其加密。

SSL握手过程

在发送已加密的HTTP报文之前,客户端和服务器需要进行一次SSL握手,在这个握手的过程中,主要完成以下工作:

  • 交换协议版本号
  • 选择一个两端都了解的加密方式
  • 对两端身份进行认证
  • 生成临时的会话密钥,以便加密信道

ssl_handshake_rsa.jpg

  1. [明文] 客户端发送随机数client_random和支持的加密方式列表
  2. [明文] 服务器返回随机数server_random ,选择的加密方式和服务器证书链
  3. [RSA] 客户端验证服务器证书,使用证书中的公钥加密premaster secret 发送给服务端
  4. 服务端使用私钥解密premaster secret
  5. 两端分别通过client_random,server_random 和premaster secret 生成master secret,用于对称加密后续通信内容

数字证书

在访问HTTPS的网站中会看到地址栏左侧会有绿色的小锁头,点击打开可以看到这其实是网站的数字证书。

75D75647-4795-4947-8D84-55290AA27EE7.png

什么是数字证书

数字证书简称CA,它由权威机构给某网站颁发的一种认可凭证,这个凭证是被大家(浏览器)所认可的。以数字证书为核心的加密技术(加密传输、数字签名、数字信封等安全技术)可以对网络上传输的信息进行加密和解密、数字签名和签名验证,确保网上传递信息的机密性、完整性及交易的不可抵赖性。使用了数字证书,即使您发送的信息在网上被他人截获,甚至您丢失了个人的账户、密码等信息,仍可以保证您的账户、资金安全。(百度百科)

为什么需要数字证书

互联网有太多的服务需要使用证书来验证身份,以至于客户端(操作系统或浏览器等)无法内置所有证书,需要通过服务端将证书发送给客户端。

客户端为什么需要验证数字证书

通过中间人攻击将请求拦截伪造证书等手段来欺骗客户端,存在安全风险。

如何验证数字证书的合法性

需要通过数字签名来验证数字证书等合法性。

数字签名

证书是一个站点的身份证,但是身份证也可以被伪造,为了保证这个证书是真的我们需要数字签名。我们会将证书内容用签名算法生成一个值,我们称之为“摘要”。然后将该摘要用主机的私钥加密,加密后的内容就是我们的数字签名。 当客户端收到附带数字签名的数字证书时,会通过数字证书中的证书签名算法将该证书生成一个摘要,在用服务器众所周知的公钥解密数字签名,看得到的摘要是否相同,相同那就说明证书是真的。 如果公钥解密后得到的摘要与生成的摘要不符那么可能有两种情况

  • 发送方身份不是目的主机
  • 目的主机发送的证书被篡改

对称和非对称加密算法

对称加密又称私钥加密,是一种混淆算法,能够在非安全信道上进行安全通信。 非对称加密又称公钥加密,它是另一种方法,使用两个密钥,而不是一个;其中一个密钥是私密的,另一个是公开的。顾名思义,一个密钥用于私人,另一个密钥会被所有人共享。这个两个密钥之间存在一些特殊的数学关系。RSA是目前普遍部署的非对称加密算法。

参考

  • 《HTTP权威指南》
  • 《HTTPS权威指南》
最近的文章

【译】编写更好JavaScript条件语句的5个技巧

当我们写JavaScript代码时,经常会用到到条件判断处理,这里有5个技巧能使你写出更好、更简洁的条件语句。1、使用Array.includes处理多种条件让我们来看一下的例子:// conditionfunction test(fruit) {if (fruit == 'apple' || fruit == 'strawberry') {console.log('red');}}一眼看去,以上的例子貌似没有什么问题。但是,如果我们加入更多的红色水果,比如车厘子(cherry)和蔓越橘(...…

继续阅读
更早的文章

jekyll常用命令

启动服务器bundle exec jekyll server新建文章bundle exec rake post title=”JS full-angle and half-angle conversion summary”构建bundle exec jekyll server…

继续阅读