写点什么

HTTP 与 HTTPS,HTTPS 更加安全。

作者:喀拉峻
  • 2021 年 11 月 10 日
  • 本文字数:1719 字

    阅读完需:约 6 分钟

HTTP与HTTPS,HTTPS更加安全。

什么是 HTTP

HTTP 是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从 WWW 服务器传输超文本到本地浏览器的传输协议。HTTP 是采用明文形式进行数据传输,极易被不法分子窃取和篡改。

1、HTTPS 是加密传输协议,HTTP 是明文传输协议;2、HTTPS 需要用到 SSL 证书,而 HTTP 不用;3、HTTPS 比 HTTP 更加安全,对搜索引擎更友好,利于 SEO;4、HTTPS 标准端口,HTTP 标准端口 80;5、HTTPS 基于传输层,HTTP 基于应用层;6、HTTPS 在浏览器显示绿色安全锁,HTTP 没有显示;

总的来说 HTTPS 比 HTTP 更加安全,能够有效的保护网站用户的隐私信息安全,这也是为什么现在的 HTTPS 网站越来越多。

HTTPS 建立过程相当复杂,下图为示意图,可以有整体认识,一般我们编程知道这些已足够。



如果你想仿照 HTTPS 实现类似加密,可以阅读下具体过程,作为参照

准备工作(对应图中 prepare1234)

可以看到,在客户端向服务器发起请求前,还有一些准备工作要做,或者说是有一些工作已经做好了。

  • 从 CA 证书颁发机构,获取数字证书。

  • 服务器:生成一对公私钥 S.pub,S.pri,私钥自己保留,用于解密和签名,不能外泄。将公钥 S.pub,身份信息,传给 CA(Certificate Authority)机构;

  • CA 机构:也有公私钥 C.pub,C.pri;由 S.pub,身份信息另外附加 CA 签名生成数字证书(签名使用 C.pri 进行签名)

  • 将数字证书颁发给申请者(服务器)

  • 客户端(比如我们经常使用的浏览器),为了安全性,会内置一份 CA 根证书,它包含公钥 C.pup,用于对数字证书验证

发起链接

https 使用的是 443 端口,而 http 使用的是 80 端口

TCP 端口号是一个 2 字节的整型,处于 TCP 报文段的前四个字节(2 字节源端口号,2 字节目的端口号)。

很明显范围是 065535。其中 01023 具有特殊意义,已经被绑定,比如上面说的 443,80,还有 ftp 的 21 端口。从 1024~49151 也具有特殊含义,但是还没有被用完,比如 8080 端口重定向。剩下的我们就可以随便使用,自定义了。

其实之前在嵌入式开发中,没有连接外网,也没有使用浏览器等等这些。所以端口完全自定义随便用,不用担心冲突:)。

下面的过程为具体详细一点的过程,如果不想看,可以完全只看示意图即可,对我们平时开发用处并不大。或者你在用 wireshark 类似的抓包工具时看的抓狂不认识,可以看看(反正我用 Charles 抓包):

1 客户端发起请求(对应图中 1)

同样需要三次握手,建立 TCP 连接(毫无疑问 HTTPS 也是基于 TCP 的)

2 客户端发送 Client Hello 包(对应图中 2)

  • 随机数

里面有 1970 年 1 月 1 日到现在的秒数,后面还有一个客户端发来的随机数 Client.random

  • Session ID

如果客户端与服务器费尽周折建立了一个 HTTPS 链接,刚建完就断了,也太可惜,所以用 Session ID 将其保存,如果下次再来可以直接使用之前的链接进行对话(对称密钥)。

  • 密文族

告诉服务器,自己支持的加密算法种类

  • Server_name

3 Server Hello(对应图中 2)

  • 随机数:对应服务器时间,服务器 sever.random

  • Seesion ID,如果客户端发给服务器的 session ID 在服务端有缓存,服务端会尝试使用这个 session;否则服务器会启用新的并返回给客户端;

  • 服务器挑选一个密文族

4 Certificate(对应图中 2)

服务器终于发来我们想要的数字证书,包含了:签发机构、过期时间、主题名称、公共密钥信息、指纹信息等等



5 Server Hello Done(对应图中 2)

服务器发送结束

6 客户端验证(对应图中 3)

客户端从内置的 CA 根证书获取 C.pub,对服务器发送来的数字证书进行验签,如果一致,说明证书是 CA 颁发的(前提是 C.pub 是真实的,确实是 CA 机构的公钥)。然后看看证书是否过期,域名是否匹配

7 生成对称密钥(对应图中 4、5、6)

客户端根据之前的:Client.random + sever.random + pre-master生成对称密钥

经过 S.pub 加密发送给服务器,之后即可通过对称密钥进行通讯。(就是之前我们熟悉的 http)

最后

在整个过程中,一共涉及 2 对公私密钥对,一对由服务器产生,主要用于加密,一对由 CA 产生,主要用于签名。

为什么要多一个 CA 呢?

假设没有 CA,那么如果服务器返回的包含公钥的包被 hack 截取,然后 hack 也生成一对公私钥,他将自己的公钥发给客户端。hack 得到客户端数据后,解密,然后再通过服务器的公钥加密发给服务器,这样数据就被 hack 获取。

有了 CA 后,客户端根据内置的 CA 根证书,很容易识别出 hack 的公钥不合法,或者说 hack 的证书不合法。

用户头像

喀拉峻

关注

左手Java右手Python,中间纹个C++ 2021.06.26 加入

还未添加个人简介

评论

发布
暂无评论
HTTP与HTTPS,HTTPS更加安全。