http、https、websocket(二)

2,352 阅读6分钟

https

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开始广泛使用于保护所有类型网站上的网页真实性,保护账户和保持用户通信,身份和网络浏览的私密性。

http 与 https 区别

http 缺点

  • 通信使用明文(不加密),内容可能会被盗用
  • 不验证通信方的身份,因此有可能遭遇伪装
  • 无法证明报文的完整性,所以有可能已遭篡改

https 结构

http 与 https 区别

HTTP + 加密 + 认证 + 完整性保护 = HTTPS

加密

和http相比,https只多了一层保障数据安全的TLS/SSL,TLS/SSL全称安全传输层协议Transport Layer Security, 是介于TCP和HTTP之间的一层安全协议,不影响原有的TCP协议和HTTP协议,所以使用HTTPS基本上不需要对HTTP页面进行太多的改造。

对称加密

对称就是指加密和解密时使用的密钥都是同一个,是“对称”的,对称加密看上去好像完美地实现了机密性,但其中有一个很大的问题:如何把密钥安全地传递给对方,术语叫“密钥交换”。因为在对称加密算法中只要持有密钥就可以解密。如果你和网站约定的密钥在传递途中被他人窃取,那之后就能随意解密收发的数据,通信过程也就没有机密性可言了。

非对称加密

非对称加密(也叫公钥加密算法),它有两个密钥,一个叫“公钥”(public key),一个叫“私钥”(private key)两个密钥是不同的,“不对称”,公钥可以公开给任何人使用,而私钥必须严格保密。公钥和私钥有个特别的“单向”性,虽然都可以用来加密解密,但公钥加密后只能用私钥解密,反过来,私钥加密后也只能用公钥解密。非对称加密可以解决“密钥交换”的问题。网站秘密保管私钥,在网上任意分发公钥,你想要登录网站只要用公钥加密就行了,密文只能由私钥持有者才能解密。而他人因为没有私钥,所以就无法知道密文。

TLS/SSL工作原理

HTTPS协议的主要功能基本都依赖于TLS/SSL协议,TLS/SSL的功能实现主要依赖于三类基本算法:散列函数 Hash、对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。

TLS 与 SSL是同一个东西,1999 年改名:SSL 3 === TLS 1.0

认证

公钥加密方式还是存在一些问题的。那就是无法证明公钥本身就是货真价实的公开密钥。比如,正准备和某台服务器 建立公开密钥加密方式下的通信时,如何证明收到的公钥就是原本预想的那台服务器发行的公钥。或许在公钥传输途中,真正的公钥已经被攻击者替换掉了。

为了解决上述问题,可以使用由数字证书认证机构(CA,Certificate Authority)和其相关机关颁发的公开密钥证书。数字证书认证机构处于客户端与服务器双方都可信赖的第三方机构的立场上。

首先,服务器的运营人员向数字证书认证机构提出公开密钥的申请。数字书认证 机构在判明提出申请者的身份之后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公钥证书后绑定在一起。服务器会将这份由数字证书认证机构颁发的公钥证书发送给客户端,以进行公开密钥加密方式通信。公钥证书也可叫做数字证书或直接称为证书。

接到证书的客户端可使用数字证书认证机构的公开密钥,对那张证书上的数字签名进行验证,一旦验证通过,客户端便可明确两件事:

  • 认证服务器的公开密钥的是真实有效的数字证书认证机构。
  • 服务器的公开密钥是值得信赖的。此处认证机关的公开密钥必须安全地转交给客户端。使用通信方式 时,如何安全转交是一件很困难的事,因此,多数浏览器开发商发布版本时,会事先在内部植入常用认证机关的公开密钥。

HTTPS 的安全通信机制

https比http安全的地方就是多了个TLS握手过程,通过TLS握手获得加密密钥最后对数据进行加密后传输

TLS握手

TLS握手何时发生?:

  • 每当用户通过HTTPS导航到网站并且浏览器首先开始查询网站的原始服务器时,就会进行TLS握手。
  • 每当其他任何通信使用HTTPS(包括API调用和HTTPS查询上的DNS)时,也会发生TLS握手。
  • 通过TCP握手打开TCP连接后,会发生TLS 握手。

具体流程描述:

  • 客户端hello:客户端通过向服务器发送“问候”消息来发起握手。该消息将包括客户端支持的TLS版本,支持的加密套件以及称为“客户端随机”的随机字节字符串。

  • 服务器hello:为回复客户端hello消息,服务器发送一条消息,其中包含服务器的SSL证书,服务器选择的加密套件和“服务器随机数”,即服务器生成的另一个随机字节串。

  • 客户端发送公钥加密的预主密钥。

  • 服务器用自己的私钥解密加密的预主密钥。

    • 客户端finished:客户端发送“完成”消息,该消息已用会话密钥加密。
    • 服务器finished:服务器发送一条用会话密钥加密的“完成”消息。
  • 握手完成,后续通过主密钥加解密。

引用文章

juejin.cn/post/684490…

juejin.cn/post/684490…

juejin.cn/post/684490…

zhuanlan.zhihu.com/p/37738632

juejin.cn/post/684490…

图解http