HTTPS学习笔记一----HTTPS的基础理论知识
首先推荐一本书,《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及约定好的算法进行加密解密。