Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HTTPS 工作原理 #39

Open
ChuChencheng opened this issue Feb 28, 2020 · 2 comments
Open

HTTPS 工作原理 #39

ChuChencheng opened this issue Feb 28, 2020 · 2 comments

Comments

@ChuChencheng
Copy link
Owner

概念

HTTPS 是在 HTTP 上建立 SSL 加密层,对传输数据进行加密,是 HTTP 的安全版。

主要作用:

  1. 对数据进行加密,建立一个信息安全通道,保证传输过程中的数据安全
  2. 对网站服务器进行真实身份认证

为什么需要 HTTPS

既然是基于 HTTP ,那说明 HTTP 肯定是在安全方面存在问题的:

  1. 通信使用明文,内容可能被窃听
  2. 无法证明报文完整性,可能被篡改
  3. 不验证服务端的身份,可能遭遇伪装

HTTPS 如何解决上述问题

HTTPS 不是一种新的协议,实际上是在 HTTP 与 TCP 之间采用了 SSL 进行加密。

HTTPS = HTTP + TLS/SSL

解决可能被窃听的问题

采用非对称加密与对称加密结合来保证

当发起一个 https 请求时:

  1. 客户端生成一个对称加密的密钥
  2. 客户端用非对称加密公钥加密生成的密钥并传给服务端
  3. 服务端用非对称加密私钥解密,得到对称加密的密钥
  4. 双方用对称加密密钥进行通信

解决报文完整性问题

采用数字签名

数字签名的作用:

  1. 保证消息是由发送方签名发出
  2. 保证消息完整性

过程:

  1. 服务端用散列算法生成消息摘要,并用私钥进行加密,得到数字签名,与原文一起传送给客户端
  2. 客户端使用公钥解密数字签名,得到消息摘要,对接收到的原文用散列算法生成摘要
  3. 客户端将生成的消息摘要与公钥解密后得到的消息摘要进行对比,如果一致,则说明信息是完整的

解决身份伪装

看了上面两个问题的解决,会发现个问题,客户端如何安全地得到非对称加密的公钥的?

实际上,单靠客户端与服务端两端,是无法保证的,因为在传输公钥的过程中也可能被拦截篡改。

这时需要引入可信的第三方机构来做这件事。

过程:

  1. 数字认证机构的公钥已经事先集成在浏览器中
  2. 服务器运营向机构提交公钥、组织信息、域名等申请认证
  3. 认证通过,机构向申请者签发证书,证书包含以下信息:(1). 申请者公钥、申请者的组织信息和个人信息、签发机构 CA的信息、有效时间、证书序列号等信息的明文 (2). 使用散列函数计算 (1) 中明文得到信息摘要,用机构的私钥加密的数字签名
  4. 客户端请求时,服务端会先发出证书
  5. 客户端读取证书中的明文信息,用散列函数得到信息摘要,然后用内置的机构的公钥解密证书中的数字签名,得到另一个摘要,对比两个信息摘要,如果一致,则可以确认证书的合法性,成功获取服务端非对称加密的公钥

HTTPS 的工作流程

知道了 HTTPS 是如何解决上述三个问题的,基本能知道 HTTPS 的工作流程了。

  1. 客户端发起一个 HTTPS 请求
  2. 服务端将公钥证书返回给客户端
  3. 客户端验证公钥证书,得到非对称加密的公钥
  4. 客户端生成对称加密密钥,用刚刚得到的非对称加密的公钥加密,发给服务端
  5. 服务端用非对称加密的私钥解密消息,得到对称加密密钥,至此,双方都拿到了相同的对称加密密钥
  6. 服务端使用对称加密密钥加密“内容 A”,发送给客户端
  7. 客户端使用对称加密密钥解密,得到“内容 A”
  8. 客户端再次发起 HTTPS 请求,使用对称加密密钥加密请求的“内容 B”,发送给服务端,服务端使用对称加密密钥解密,得到“内容 B”

HTTP 与 HTTPS 的区别

  • HTTPS 更安全
  • HTTPS 对搜索引擎更友好,利于 SEO
  • HTTPS 需要用到 SSL 证书, HTTP 不需要
  • HTTPS 默认端口 443 , HTTP 默认端口 80
  • HTTPS 工作在传输层,而 HTTP 是应用层协议
  • HTTPS 在浏览器会显示安全锁

参考

@ChuChencheng
Copy link
Owner Author

启用 HTTPS 就安全了吗?

实际上,用户在输入网址时,大多数时候是不会带上 https:// 的,例如要打开 Google ,我们一般直接输入 google.com ,而不是输入完整的 https://www.google.com/

这时候,有的站点会进行一次重定向,从 http 重定向到 https 。但是在这重定向的过程中,还是用 http 的,这样还是有上面说到的问题。

这时候可以考虑使用 HSTS

参考: HSTS详解

@ChuChencheng
Copy link
Owner Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant