HTTPS详解

  • Post author:
  • Post category:其他


写在前面

参考


https连接的前几毫秒发生了什么



HTTP与HTTPS的区别


HTTPS概念

HTTPS = HTTP + TLS

使用TLS对数据进行加密,但是数据传输依旧使用的是TCP。因此HTTPS作用有二:一是保护数据安全,二是通过证书验证网站的真实性。

HTTPS主要解决的问题是中间人攻击,中间人攻击一是可以窃取连接过程中的数据并篡改,二是可以欺骗客户端将数据包发往中间人处。

有了HTTPS可以很好地解决这个问题:可以通过证书验证网站的可信度并且对数据进行加密防止被篡改。


HTTP与HTTPS的区别

  1. https需要证书,可以自己制作或者购买。自己制作的没有得到验证将会跳出弹窗请求用户允许。
  2. http数据是明文传输的,https则是加密传输。
  3. http端口为80,https为443。

HTTPS工作原理

https的连接有几个过程,下面一一说明。

客户端发起HTTPS请求

浏览器会给服务器发送一个包,主要有以下信息:

  • TLS版本:主要说明客户端使用TLS的版本号

  • 随机字符串: 用于之后的密钥对生成

  • sessionId: 会话id,第一次连接时为0。之后可以通过这个sessionId进行重新连接而不需要进行握手阶段。

  • 浏览器支持的所有加密方式: 发送给服务器让其选择一个加密方式,之后按照这个加密方式给数据进行加密。

  • 域名信息: 虽然握手阶段是在传输层的,但是获取相应证书需要发送域名信息。

服务端回应(Server Hello)

这个包会发送到客户端,里面的内容和上面客户端发送包的内容差不多。

  • sessionId: 服务端发送给客户端设置其sessionId。

  • 随机字符串: 用于之后的密钥生成。

  • 服务端选择的加密方式: 上面有提到客户端会发送一系列加密方式给服务端选择,服务端会将其选择返回给服务端。

服务端发送证书

随后服务端会发送证书给客户端,证书不一定是一份,而且很有可能是多份。每一份证书和上级证书都有依赖关系,这样只需要验证最上级证书的可靠性就可以保证下级证书的可靠性。

证书有以下内容:

  • 签名:表示证书的依赖关系。如果验证了签名正确,那么就可以验证下级证书的正确性。签名是服务端用密钥与tbsCertificate加密得到的一个字符串。
  • 签名算法
  • tbsCertificate(to be signed Certificate): 包含申请证书时的国家、地区、城市、证书支持的域名、申请时间以及过期时间等。最重要的是

    证书的公钥

这里主要说一下签名的用处,签名主要是用来检验证书是否被篡改过的。

主要的方式是 1. 客户端会使用穿过来的公钥对签名进行解密,得到一个hash值。2. 计算tbsCertificate的DER编码值的hash值。 3. 对比二者的hash值,若相同表示没有被篡改过。

进行密钥交换

上面说过服务器会选择一个加密方式比如

Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)

其中这表示服务器选中的

密钥交换

加密方式为

RSA



数据传输

加密方式为

AES



检验数据

是否合法的算法为

SHA256

.

密钥交换的过程是这样的:

  1. 服务端传来一个包包含它的公钥。
  2. 客户端使用上面服务端传来的随机值和这个公钥进行加密,生成自己的密钥对。
  3. 发送自己的公钥给服务端。

RSA:

(1)乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。

(2)甲方获取乙方的公钥,然后用它对信息加密。

(3)乙方得到加密后的信息,用私钥解密。

所以此时双方都拥有对方的公钥,可以使用这个进行加密,对方再用私钥进行解密。

进行数据传输

交换完密钥后,服务端会发送一个明文包给客户端表示可以其已经准备好传输了,客户端也会发送一个这样的包表示自己准备好了。然后客户端就可以开始进行数据传输了。


缺点

说了这么多,难道HTTPS没有缺点吗?

  1. 建立https需要花费时间(~0.3s)
  2. 数据需要加密和解密,占用更多的cpu
  3. 数据加密后比原信息更大,占用更多的带宽



版权声明:本文为qq_31628337原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。