共计 3055 个字符,预计需要花费 8 分钟才能阅读完成。
首先推荐一本书,《HTTP 权威指南》我就是看这本书入门的,对 http 协议有了更好的理解,学习 https 的理论知识我认为需要了解以下几点,需要一步步的深入学习:
1、HTTPS 的基本概念?
2、HTTPS 和 HTTP 的差别?HTTP + 数据加密技术 =HTTPS?HTTPS 所谓的安全是指哪里安全?
3、HTTPS 的详细交互过程?
4、基础的密码学知识学习:数字加密,对称密钥,非对称密钥,数字签名,数字证书的基本概念。
5、使用 openssl 怎么制造自签证书?
6、实现简单的 https 的客户端和服务器端(Python 版本)
7、利用 wireshake 抓包进一步分析 HTTPS 协议
8、实际项目开发过程中遇到的问题总结
其中 1 - 3 个点,放在本笔记中,4 放在同系列学习笔记二下;5 放在同系列学习笔记三下;6 放在同系列学习笔记四下;7 放在同系列学习笔记五下
一、HTTPS 的基本概念
HTTPS 是最流行的 HTTP 安全形式。它是由网景公司首创的,所有主要的浏览器和服务器都支持此协议。HTTPS 的 URL 以 https://,而不是 http:// 开头,据此就可以分辨某个 Web 页面是通过 HTTPS 而不是 HTTP 访问的。
HTTPS = HTTP + SSL(TLS),HTTPS 就是在安全的传输层上发送的 HTTP。如下图所示:HTTPS 没有将未加密的 HTTP 报文发送给 TCP,它在将 HTTP 报文发送给 TCP 之前,先将其发送给了一个安全层,对其进行加密。现在,HTTP 安全层是通过 SSL 及其现代替代协议 TLS 来实现的。我们遵循常见的用法,用术语 SSL 来表示 SSL 或者 TLS。
二、HTTPS 与 HTTP 的区别
HTTP + 业务数据加密技术 ≠ HTTPS;因为 HTTPS = HTTP + SSL(TLS),SSL ≠ 业务数据加密技术;SSL 是安全层,建立 SSL 隧道需要做隧道认证,至少要完成单向认证(服务器认证)或者双向认证,之后数据在传输的过程中都进行了加密处理;通常 HTTP 使用的在业务层做的数据字段的加密,是业务数据的加密,传输的过程中是没有加密的;而 HTTPS 的加密是指传输层的加密。HTTPS 跟 HTTP 相比,有以下几个明显的优点:
• 服务器认证(客户端知道它们是在与真正的而不是伪造的服务器通话);
• 客户端认证(服务器知道它们是在与真正的而不是伪造的客户端通话),通常现在 web 服务,不需要做客户端认证,只需要做服务器认证;
• 完整性(客户端和服务器的数据不会被修改),因为整个传输过程是加密的;
• 加密(客户端和服务器的对话是私密的,无需担心被窃听),使用 wireshake 监听 HTTPS 端口会捕获不到数据。
• 效率(一个运行的足够快的算法,以便低端的客户端和服务器使用),如果使用 HTTP+ 特别复杂的数据加密技术来试图替代 HTTPS,交互的双方在加解密的过程会消耗大量的性能,性能下降特别明显。
• 普适性(基本上所有的客户端和服务器都支持这些协议)。
• 管理的可扩展性(在任何地方的任何人都可以立即进行安全通信)。
• 适应性(能够支持当前最知名的安全方法)。
• 在社会上的可行性(满足社会的政治文化需要)。
三、HTTPS 的交互过程
1、历程一:利用非对称加密传输数据,HTTP + 非对称加密技术
采用 HTTP 协议,利用非对称加密 RSA 技术对数据进行加密(RSA 算法自身,甚至 RSA 实现的源代码,破解代码找到相应的私有密钥的难度仍相当于对一个极大的数进行质因数分解的困难程度,这种计算被认为是所有计算机科学中最难的问题之一)
只要服务器端保存好私钥,这样看来数据的传输铁定是没问题的,但是这还有一个很大的风险,如果黑客假冒自己是服务器端,把客户端的公钥替换成跟黑客服务器匹配的一对公钥,客户端会在不知情的情况下,与黑客服务器进行交互。
2、历程二:签名证书 + SSL 加密,验证服务器身份,加密传输通道,所有的通信数据在应用层下加密传输,保证传输层安全。HTTPS
交互过程如上图所示,详细的描述了在简历 TCP 请求后,SSL 握手的过程,整个 HTTPS 的交互过程大致如下:
第一步:1-3 服务器端生成一个证书请求,服务器向权威的 CA 机构申请证书,一般是把公钥给 CA 进行加密生成带 CA 签名的证书。
第二步:4 如果 CA 是权威的机构,一般情况下浏览器会报错 CA 的根证书,如果是自签,则需要客户端主动加载或者选择信任服务器发来的证书。
第三步:5 建立底层 socket 服务,完成 TCP 的三次握手。
第四步:6 建立传输层的 SSL 握手,具体又可描述为:
A : 6.0-6.1 客户端发起 clent hello 请求:将自己支持的一套加密规则、以及一个随机数(Random_C)发送给服务器。
B : 6.2-6.3 服务器响应 server hello:服务器根据自己支持的加密规则,从客户端发来的请求中选出一组加密算法与 HASH 算法,生成随机数(Random_S),并将自己的身份信息以证书(CA)的形式发回给浏览器。
C: 6.4-6.5 客户端接到服务器的初步响应后做四件事情, 然后把数据发送给服务器端:
(1)证书校验:验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等)。
(2)生成密码:浏览器会生成一串随机数的密码(Pre_master),并用 CA 证书里的公钥加密 (enc_pre_master),用于传给服务器。
(3)计算协商密钥:
此时客户端已经获取全部的计算协商密钥需要的信息:两个明文随机数 Random_C 和 Random_S 与自己计算产生的 Pre-master,计算得到协商密钥 enc_key。enc_key=Fuc(random_C, random_S, Pre-Master)
(4)生成握手信息:使用约定好的 HASH 计算握手消息,并使用协商密钥 enc_key 及约定好的算法对消息进行加密。
D: 6.6-6.7 服务器端接收到客户端发来的 SSL 握手信息后,做以下 3 件事:
(1)私钥解密:使用自己的私钥从接收到的 enc_pre_master 中解密取出密码 Pre_master。
(2)计算协商密钥:此时服务器已经获取全部的计算协商密钥需要的信息:两个明文随机数 Random_C 和 Random_S 与 Pre-master,计算得到协商密钥 enc_key。enc_key=Fuc(random_C, random_S, Pre-Master)
(3)解密握手消息:使用协商密钥 enc_key 解密客户端发来的握手消息,并验证 HASH 是否与客户端发来的一致。
(4)生成握手消息使用协商密钥 enc_key 及约定好的算法加密一段握手消息,发送给客户端。
第五步:7 正常加密通信
握手成功之后,所有的通信数据在应用层下都将由之前协商密钥 enc_key 及约定好的算法进行加密解密。
: