HTTPS

目录

HTTPS协议原理

什么是加密

为什么要加密

常见的加密方式

1.对称加密:

2.非对称加密:

3.数据摘要&&数据指纹

数字签名

HTTPS的工作过程探究

方案1:只使用对称加密

方案2:只使用非对称加密

方案3:双方都使用非对称加密

方案4:非对称加密 + 对称加密

中间人攻击 - 针对上面的场景

引入证书

CA认证

自己使用Linux生成一对密钥和CSR文件:

生成CSR文件

进行CA认证

理解数据签名(数字签名)

方案5:非对称加密 + 对称加密 + 证书认证

中间人有没有可能篡改该证书?

中间人整个掉包证书?

为什么数据摘要内容在网络传输的时候一定要加密形成签名?

为什么签名不直接加密,而是要先hash形成摘要?

如何成为中间人 - 了解

完整流程

HTTPS协议原理

HTTPS是什么,HTTPS也是⼀个应⽤层协议,是在HTTP协议的基础上引⼊了⼀个加密层。 HTTP协议内容都是按照⽂本的⽅式明⽂传输的,这就导致在传输过程中出现⼀些被篡改(被抓包修改)的情况。

HTTPS(Hypertext Transfer Protocol Secure)是一种用于安全传输数据的通信协议。它是在HTTP协议的基础上引入了加密层,通过使用SSL(Secure Socket Layer)或其继任者TLS(Transport Layer Security)协议来保护数据传输的安全性和完整性。HTTPS主要解决了HTTP在传输过程中可能遇到的被篡改、窃听等安全问题。

下面是HTTPS的一些主要原理和特点:

  1. 加密通信: HTTPS使用SSL/TLS协议对传输的数据进行加密,这样即使被第三方截获了通信内容,也无法解读其具体内容。这为用户和网站提供了更高的安全性。
  2. 身份验证: HTTPS通过证书机制对通信的双方进行身份验证。网站必须使用由可信证书颁发机构(CA)签发的数字证书,这样客户端才能验证网站的真实性。这防止了中间人攻击,确保用户连接的是合法的服务器。
  3. 数据完整性: 除了加密通信外,HTTPS还通过哈希函数等机制保证数据的完整性。这确保在传输过程中数据没有被篡改。
  4. HTTPS握手过程: 当客户端和服务器建立HTTPS连接时,它们会执行一种称为“握手”的过程。在握手过程中,双方协商密钥、验证证书、选择加密算法等,确保建立一个安全的通信通道。
  5. 使用443端口: 默认情况下,HTTPS使用TCP的443端口进行通信,与HTTP的80端口相对应。这样使得HTTP和HTTPS可以共存于同一服务器,通过端口的不同来区分。

总的来说,HTTPS通过加密、身份验证和数据完整性保护了用户和网站之间的通信,提高了网络传输的安全性。在现代互联网中,许多网站都采用了HTTPS以确保用户的隐私和安全。

什么是加密

加密是一种将明文(原始数据或信息)经过一系列变换生成密文的过程,而解密则是将密文再经过相应的变换还原成明文的过程。在这个过程中,通常需要使用一个或多个中间的数据,这些数据称为密钥。

加密过程:

  1. 明文输入: 原始的、未经加密的数据称为明文。
  2. 加密算法: 使用特定的加密算法对明文进行变换,产生密文。
  3. 密钥: 加密算法通常需要一个密钥,这个密钥是用来影响加密算法行为的参数。

解密过程:

  1. 密文输入: 经过加密得到的数据称为密文。
  2. 解密算法: 使用相应的解密算法对密文进行变换,还原成明文。
  3. 密钥: 解密算法通常也需要使用与加密时相同的密钥。

密钥在加密和解密的过程中起到关键的作用,它是影响加密算法行为的参数,同时也是确保只有合法用户能够正确解密数据的重要因素。密钥可以分为对称密钥和非对称密钥两种类型:

  • 对称密钥(Symmetric Key): 加密和解密使用相同的密钥。这意味着发送方和接收方在通信中都需要共享同一个密钥。对称加密算法效率高,但密钥管理相对复杂。
  • 非对称密钥(Asymmetric Key): 加密和解密使用不同的密钥,一把用于加密,另一把用于解密。这种方法解决了对称密钥的密钥分发问题,但相对来说计算成本较高。

加密技术在信息安全领域中扮演着重要的角色,用于保护数据的机密性、完整性和可用性。常见的加密算法包括DES、AES、RSA等。

为什么要加密

臭名昭著的"运营商劫持",比如下载⼀个天天动听

未被劫持的效果,点击下载按钮,就会弹出天天动听的下载链接:

已被劫持的效果,点击下载按钮,就会弹出QQ浏览器的下载链接:

由于我们通过⽹络传输的任何的数据包都会经过运营商的⽹络设备(路由器。交换机等),那么运营商的⽹络设备就可以解析出你传输的数据内容,并进⾏篡改。点击"下载按钮",其实就是在给服务器发送了⼀个HTTP请求,获取到的HTTP响应其实就包含了该APP的下载链接,运营商劫持之后,就发现这个请求是要下载天天动听,那么就⾃动的把交给⽤⼾的响应给篡改成"QQ浏览器"的下载地址了。

所以:因为http的内容是明文传输的,明文数据会经过路由器、wifi热点、通信服务运营商、代理服务器等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了。劫持者还可以篡改传输的信息且不被双方察觉,这就是|中间人攻击,所以我们才需要对信息进行加密。

思考下,为啥运营商要进行劫持?

  1. 广告注入: 运营商可能通过劫持HTTP流量来注入广告,以获取额外的广告收入。这种行为可能对用户体验产生负面影响,因为用户在访问网站时会看到未经请求的广告。
  2. 流量监控和分析: 运营商可能对用户的网络活动进行监控和分析,以了解用户的兴趣、行为模式和使用习惯。这样的信息可以用于制定精准的广告投放策略,但也引发了隐私问题。
  3. 提供增值服务: 运营商可能通过劫持流量来提供一些增值服务,例如压缩图像以节省用户的带宽费用。然而,这样的操作可能违反用户的隐私权和网络中立性原则。
  4. 内容过滤和审查: 在某些国家,运营商可能被要求履行政府的审查义务,对特定的网站或内容进行过滤和审查。劫持流量是一种实施这种审查的方式。
  5. 提高服务质量: 有时,运营商可能劫持流量以优化网络性能,例如通过压缩图片或视频来提高加载速度。然而,这也可能导致对原始内容的质量损失。

不止运营商可以劫持,其他的黑客也可以用类似的手段进行劫持,来窃取用户隐私信息,或者篡改内容。试想一下,如果黑客在用户登陆支付宝的时候获取到用户账户余额,甚至获取到用户的支付密码....在互联网上,明文传输是比较危险的事情!

HTTPS就是在HTTP的基础上进行了加密,进一步的来保证用户的信息安全

常见的加密方式

常见的加密方式可以分为对称加密和非对称加密两大类,以及哈希函数。以下是一些常见的加密方式:

1.对称加密:

对称加密是一种加密方法,它采用单一密钥进行加密和解密。这意味着相同的密钥用于对信息进行加密和解密操作,因此也被称为单密钥加密。以下是对称加密的一些关键特征和常见算法的简要说明:

特征:

  1. 同一密钥用于加密和解密: 对称加密使用相同的密钥来执行加密和解密操作,这是其主要特征。
  2. 算法公开: 加密和解密所使用的算法是公开的,只有密钥是保密的。
  3. 计算量小: 对称加密通常具有较小的计算量,这使得它们在资源受限的环境中表现优越。
  4. 加密速度快: 由于只涉及单一密钥,对称加密通常能够提供快速的加密速度。

常见对称加密算法:

  1. DES(Data Encryption Standard): 使用56位密钥,但由于密钥长度短,安全性受到质疑,已经不再推荐使用。
  2. 3DES(Triple DES): 是对DES的改进,对数据执行三次DES操作,提高了安全性。
  3. AES(Advanced Encryption Standard): 目前广泛使用的对称加密算法,支持不同的密钥长度,包括128位、192位和256位。
  4. TDEA(Triple Data Encryption Algorithm): 也称为Triple DES,是3DES的缩写,是对DES的三次迭代。
  5. Blowfish: 一种对称加密算法,以其简单、高效、可靠而闻名。
  6. RC2(Rivest Cipher 2): 由Ron Rivest设计,是对称加密算法之一。

对称加密其实就是通过同一个"密钥",把明文加密成密文,并且也能把密文解密成明文。

一个简单的对称加密,按位异或:

假设明文a=1234,密钥key = 8888则加密 a^ key得到的密文b为9834。

然后针对密文9834再次进行运算b ^ key,得到的就是原来的明文1234。(对于字符串的对称加密也是同理,每一个字符都可以表示成一个数字)当然,按位异或只是最简单的对称加密.HTTPS中并不是使用按位异或。

2.非对称加密:

非对称加密使用一对密钥,分别是公开秘钥(全网公开,简称公钥,翻译为 public key)和私有秘钥(只能自己拥有,简称私钥,翻译为 private key)。公钥用于加密,私钥用于解密,或者,私钥用于加密,公钥用于解密。信息被使用接收者的公钥加密后变成密文,只能使用相应的私钥进行解密变成明文。非对称加密提供了更高的安全性,尤其是在密钥传递的过程中,因为公钥可以被分享而私钥必须保持私密。常见的非对称加密算法包括RSA、DSA和ECDSA等。

  • 公钥和私钥配对: 非对称加密使用一对密钥,分别是公钥和私钥。这两个密钥是数学上相关联的,任何用公钥加密的信息只能用相应的私钥解密,反之亦然。
  • 常见算法: 你提到的RSA、DSA和ECDSA是常见的非对称加密算法。它们在实现上有一些不同,但都符合非对称加密的基本原理。
  • 复杂的算法强度: 非对称加密算法通常较为复杂,其安全性取决于算法的复杂性和密钥的长度。较长的密钥通常提供更高的安全性,但也会增加加密和解密的计算成本。
  • 运算速度慢: 非对称加密的主要缺点之一是运算速度相对较慢,尤其是与对称加密相比。因此,在实际应用中,通常会使用对称加密算法来加密长文本,而对称加密算法的密钥则使用非对称加密算法进行安全地传输。
  1. RSA(Rivest–Shamir–Adleman): 一种常见的非对称加密算法,用于加密和数字签名。基于公钥和私钥的概念。
  2. ECC(Elliptic Curve Cryptography): 使用椭圆曲线的非对称加密算法,相较于RSA,在相同的安全级别下,使用更短的密钥长度。

非对称加密的数学原理比较复杂,涉及到一些数论相关的知识,这里举一个简单的生活上的例子,A要给B一些重要的文件,但是B可能不在,于是A和B提前做出约定:

B说:我桌子上有个盒子,然后我给你一把锁,你把文件放盒子里用锁锁上,然后我回头拿着钥匙来开锁取文件。在这个场景中,这把锁就相当于公钥,钥匙就是私钥,公钥给谁都行(不怕泄露),但是私钥只有B自己持有,持有私钥的人才能解密。

3.数据摘要&&数据指纹

数字指纹(数据摘要),其基本原理是利用单向散列函数(Hash函数)对信息进行运算,生成一串固定长度的数字摘要。数字指纹并不是一种加密机制,但可以用来判断数据有没有被窜改。

基本原理:

  • Hash函数: 数字指纹的生成依赖于单向散列函数,也称为Hash函数。这类函数具有一个关键特征,即对于输入数据的微小改变,输出的摘要应该发生巨大变化。这使得通过比较摘要可以检测数据是否被篡改。
  • 不可逆性: Hash函数是不可逆的,即从摘要难以反推出原始数据。这增加了数字指纹在确保数据完整性方面的可靠性。和加密算法的区别是,摘要严格意义不是加密,因为没有解密,只不过从摘要很难反推原信息,通常⽤来进行数据对比。

数据摘要(Data Digest):

  • 定义: 数据摘要是一种通过对原始数据应用哈希函数来生成固定长度摘要的技术。这个摘要通常被称为哈希值或摘要值。
  • 过程: 哈希函数将任意大小的数据映射为固定大小的哈希值。即使原始数据的微小变化,也会导致哈希值的巨大变化,因此通过比较哈希值,可以检测到数据的任何变化。
  • 应用: 数据摘要常用于验证文件的完整性、密码存储、数字签名等场景。在密码学中,数据摘要是一种单向函数,不可逆。

数据指纹(Data Fingerprint):

  • 定义: 数据指纹是通过对原始数据应用某种算法生成的唯一标识符,类似于人类的指纹。这个标识符通常更注重数据的唯一性,而不仅仅是完整性。
  • 过程: 数据指纹生成过程可能包括使用特定的算法,如哈希函数,但也可能涉及更复杂的技术,例如使用唯一的硬件特征或基于数据内容的算法。
  • 应用: 数据指纹的应用范围广泛,包括数字水印、数字版权保护、防伪等。数据指纹通常用于识别特定数据的来源和完整性,并在需要追踪或验证数据时发挥作用。

常见算法:

  • MD5(Message Digest Algorithm 5): 生成128位(16字节)的摘要,已经被认为是不安全的,因为存在碰撞风险。
  • SHA-1(Secure Hash Algorithm 1): 生成160位(20字节)的摘要,也因碰撞问题逐渐不再被推荐使用。
  • SHA-256、SHA-512等: 这些是SHA-2系列的变种,分别生成256位和512位的摘要,目前被广泛应用,相对较安全。

碰撞:

  • 碰撞概率: 由于Hash函数将无限的输入空间映射到有限的输出空间,存在碰撞(两个不同的输入产生相同的摘要)的可能性。然而,对于安全的Hash函数,碰撞的概率非常低,确保在实际应用中极少发生。

应用:

  • 数据完整性验证: 数字指纹主要用于验证数据在传输或存储中是否被篡改。接收方可以重新计算数据的数字指纹并与发送方提供的数字指纹进行比较,以确定数据是否安全。
  • 密码存储: 在密码学中,数字指纹也用于存储密码的安全哈希,以防止密码泄露时暴露用户的真实密码。

总结:

  • 共同点: 数据摘要和数据指纹都是用于确保数据完整性和唯一性的技术,它们通过生成固定长度的标识符来实现这一目标。
  • 区别: 数据摘要更注重完整性验证,而数据指纹更注重数据的唯一性和标识。

这两种技术都在信息安全和数据管理领域中发挥着关键作用,确保数据在传输和存储中不受损坏或篡改。

数字签名

摘要经过加密,就得到数字签名(下面进行解释)。

HTTPS的工作过程探究

既然要保证数据安全,就需要进行"加密"。

网络传输中不再直接传输明文了,而是加密之后的"密文"。

加密的方式有很多,但是整体可以分成两大类:对称加密 非对称加密

方案1:只使用对称加密

如果通信双方都各自持有同一个密钥X,且没有别人知道,这两方的通信安全当然是可以被保证的(除非密钥被破解)

引入对称加密之后,即使数据被截获,由于黑客不知道密钥是啥,因此就无法进行解密,也就不知道请求的真实内容是啥了。

但事情没这么简单,服务器同一时刻其实是给很多客户端提供服务的,这么多客户端,每个人用的秘钥都必须是不同的(如果是相同那密钥就太容易扩散了,黑客就也能拿到了),因此服务器就需要维护每个客户端和每个密钥之间的关联关系,这也是个很麻烦的事情。

⽐较理想的做法,就是能在客⼾端和服务器建⽴连接的时候,双⽅协商确定这次的密钥是啥。

但是如果直接把密钥明文传输,那么黑客也就能获得密钥了,此时后续的加密操作就形同虚设了。因此密钥的传输也必须加密传输!

但是要想对密钥进行对称加密,就仍然需要先协商确定一个"密钥的密钥"这就成了"先有鸡还是先有蛋"的问题了.此时密钥的传输再用对称加密就行不通了。

方案2:只使用非对称加密

鉴于非对称加密的机制,如果服务器先把公钥以明文方式传输给浏览器,之后浏览器向服务器传数据前都先用这个公钥加密好再传,从客户端到服务器信道似乎是安全的(有安全问题),因为只有服务器有相应的私钥能解开公钥加密的数据。

但是服务器到浏览器的这条路怎么保障安全?

如果服务器用它的私钥加密数据传给浏览器,那么浏览器用公钥可以解密它,而这个公钥是一开始通过明文传输给浏览器的,若这个公钥被中间人劫持到了,那他也能用该公钥解密服务器传来的信息了。

所以方案2和方案1存在一样的问题,只能保证单向通信的安全。

方案3:双方都使用非对称加密

  1. 服务端拥有公钥S与对应的私钥S,客户端拥有公钥C与对应的私钥C。
  2. 客户和服务端交换公钥
  3. 客户端给服务端发信息:先用公钥S对数据加密,再发送,只能由服务器解密,因为只有服务器有私钥S
  4. 服务端给客户端发信息:先用公钥C对数据加密,在发送,只能由客户端解密,因为只有客户端有私钥C
  5. 这样貌似也行啊,但是效率太低(因为运算速度慢,对于网络通信是一件不友好的事)
  6. 依旧有安全问题

方案4:非对称加密 + 对称加密

先解决效率问题

  1. 服务端具有非对称公钥S和私钥S。
  2. 客户端发起https请求,获取服务端公钥S。
  3. 客户端在本地生成对称密钥C,通过公钥S加密,发送给服务器。
  4. 由于中间的网络设备没有私钥,即使截获了数据,也无法还原出内部的原文,也就无法获取到对称密钥(真的吗?存在安全问题)。
  5. 服务器通过私钥S解密,还原出客户端发送的对称密钥C,并且使用这个对称密钥加密给客户端返回的响应数据。
  6. 后续客户端和服务器的通信都只用对称加密即可,由于该对称密钥只有客户端和服务器两个主机知道,其他主机/设备不知道密钥即使截获数据也没有意义(解决效率问题)。

中间人攻击 - 针对上面的场景

Man-in-the-MiddleAttack,简称“MITM攻击”

确实,在方案2/3/4中,客户端获取到公钥S之后,对客户端形成的对称秘钥X,用服务端给客户端的公钥S进行加密,中间人即使窃取到了数据,此时中间人确实无法解出客户端形成的密钥X,因为只有服务器有私钥S。

但是中间人的攻击,如果在最开始握手协商的时候就进行了,那就不一定了,假设hacker已经成功成为中间人

  1. 服务器具有非对称加密算法的公钥S私钥S中间人具有非对称加密算法的公钥M私钥M
  2. 客户端向服务器发起请求,服务器明文传送公钥S给客户端
  3. 中间人劫持数据报文,提取公钥S并保存好,然后将被劫持报文中的公钥S替换成为自己的公钥M,并将伪造报文发给客户端
  4. 客户端收到报文,提取公钥M(自己当然不知道公钥被更换过了),自己形成对称秘钥X,用公钥M加密对称密钥X,形成报文发送给服务器
  5. 中间人劫持后,直接用自己的私钥M进行解密,得到通信的对称秘钥X,再用曾经保存的服务端公钥S加密后,将报文推送给服务器

服务器拿到报文,用自己的私钥S解密,得到通信秘钥X

双方开始采用X进行对称加密,进行通信。但是一切都在中间人的掌握中,劫持数据,进行窃听甚至修改,都是可以的。

上面的攻击方案,同样适用于方案2,方案3

问题本质出在哪里了呢?客户端无法确定收到的含有公钥的数据报文,就是目标服务器发送过来的!(client无法验证公钥的合法性)

引入证书

CA认证

服务端在使用HTTPS前,需要向CA机构申领一份数字证书,数字证书里含有证书申请者信息、公钥信息等。服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了,证书就如身份证,证明服务端公钥的权威性。

CA认证基本说明:CA认证_百度百科

这个证书可以理解成是一个结构化的字符串,里面包含了以下信息:

  • 证书发布机构
  • 证书有效期
  • 公钥
  • 证书所有者
  • 签名
  • ......

需要注意的是:申请证书的时候,需要在特定平台生成,可以选择生成单独的公钥或者一对密钥(公钥和私钥)。这把公钥就是用来在网络通信中进行明文加密以及数字签名的。

公钥会随着CSR文件,一起提交给CA进行权威认证,私钥服务端自己进行保留,用来后续进行通信解密(其实主要就是用来交换对称秘钥)

可以使⽤在线⽣成CSR和私钥:CSR在线生成工具
形成CSR之后,后续就是向CA进⾏申请认证,不过⼀般认证过程很繁琐,⽹络各种提供证书申请的服
务商,⼀般真的需要,直接找平台解决就⾏。

注:公钥和私钥也可以自己进行生成,不需要特定的平台生成(比如自己使用Linux进行生成!

自己使用Linux生成一对密钥和CSR文件:

方法一:

下面一个例子,演示如何使用 ssh-keygen 命令来生成密钥对。ssh-keygen 是一个用于 SSH 密钥管理的工具,也可以生成一对公钥和私钥。

以下是使用 ssh-keygen 的步骤:

  1. 打开终端。
  2. 运行以下命令生成密钥对:
ssh-keygen -t rsa -b 2048 -f my_key

这将生成一对2048位的 RSA 密钥,私钥将保存在 my_key 文件中,而公钥将保存在 my_key.pub 文件中。如果您不指定文件名,ssh-keygen 默认会使用 id_rsa 和 id_rsa.pub。

  1. 在生成密钥对的过程中,系统可能会要求您提供密钥的密码。这是可选的,如果您选择设置密码,私钥文件将被加密。

现在,您已经生成了一对公钥和私钥。私钥文件 (my_key) 应该保持机密,而公钥文件 (my_key.pub) 可以与其他人分享。

请注意,虽然 ssh-keygen 是一个常用的工具,但具体的工具和方法可能会因操作系统和使用的软件而有所不同。在某些情况下,还可以使用编程语言(如 Python、Java 等)提供的库来生成密钥对。

在使用 ssh-keygen 命令生成密钥对时,有三个主要选项,它们分别是 -t、-b、和 -f。

以下是这些选项的解释:

  1. -t:指定生成密钥的算法类型(type)。在这里,rsa 表示使用 RSA 算法生成密钥对。其他可能的值包括 dsa(Digital Signature Algorithm)和 ecdsa(Elliptic Curve Digital Signature Algorithm)等。在示例中,命令使用 -t rsa 表示生成一个 RSA 密钥对。
  2. -b:指定密钥的位数(bits)。在这里,2048 表示生成的 RSA 密钥将包含 2048 位。通常,位数越多,密钥越强大,但也会增加计算成本。您可以根据需要调整这个值。在示例中,命令使用 -b 2048 表示生成 2048 位的 RSA 密钥。
  3. -f:指定生成的密钥文件的名称。在这里,my_key 是您指定的文件名前缀。生成的私钥文件将命名为 my_key,而公钥文件将命名为 my_key.pub。如果您不指定文件名,ssh-keygen 将使用默认的文件名,如 id_rsa 和 id_rsa.pub。

综合起来,示例命令 ssh-keygen -t rsa -b 2048 -f my_key 表示使用 RSA 算法生成一个包含 2048 位的密钥对,并将私钥保存为 my_key,公钥保存为 my_key.pub。

如果您不再需要生成的密钥对,您可以直接删除相应的密钥文件。一般来说,您可以通过使用文件管理命令来删除生成的密钥文件也就是直接使用 rm 指令直接进行删除即可。

方法二:

首先需要安装 OpenSSL 工具,可以按照以下步骤进行安装:

在 Linux 上:

使用包管理器安装 OpenSSL。具体命令可能因您使用的 Linux 发行版而异。以下是一些示例:

在 CentOS上:

sudo yum install openssl

在Linux系统上,需要使用 openssl 工具生成一对密钥。以下是使用 Linux 命令行生成密钥对的简单步骤:

  1. 打开终端。
  2. 使用以下命令生成私钥文件:
openssl genpkey -algorithm RSA -out private_key.pem

这将生成一个私钥文件 (private_key.pem),采用 RSA 算法。

  1. 如果您还需要生成相应的公钥文件,可以运行以下命令:
openssl rsa -pubout -in private_key.pem -out public_key.pem

这将从私钥文件提取公钥并保存到 public_key.pem 文件中。

现在,您已经生成了一对公钥和私钥文件,可以根据需要在您的应用程序中使用它们。请注意,私钥文件应该保持机密,而公钥文件可以与其他人分享。

生成CSR文件

如果您希望生成证书请求 (CSR),可以使用以下步骤:

生成 Certificate Signing Request (CSR) 通常是在您需要向证书颁发机构(CA)申请数字证书时执行的步骤。CSR 包含有关您的组织信息以及公钥的信息,CA 将使用这些信息来签署数字证书。

以下是使用 OpenSSL 工具生成 CSR 的基本步骤:

  1. 运行以下命令生成 CSR:
openssl req -new -key private_key.pem -out my_csr.pem

这将生成 CSR,并将其保存在名为 my_csr.pem 的文件中。在这个过程中,您将需要提供有关组织、通用名(通常是您的域名)等信息。-key 选项用于指定私钥文件,-out 选项用于指定生成的 CSR 文件。

  1. 在生成 CSR 过程中,您将需要回答一些有关组织和证书信息的问题。最重要的是 Common Name (CN),通常是您的域名。其他信息也可以提供,但并非都是必需的。
  2. 完成后,您将在指定的输出文件中找到生成的 CSR。

请注意,CSR 是一个包含有关您组织身份的文本文件,而私钥文件 private_key.pem 应该仅限于您自己保存。CSR 中的信息将被 CA 用于创建数字证书。生成 CSR 之后,您可以将其提交给 CA 进行签名,以获取数字证书。

生成 Certificate Signing Request (CSR) 的 OpenSSL 命令包含一系列选项,这些选项用于配置 CSR 中的各种信息。以下是生成 CSR 文件的 OpenSSL 指令及其携带的选项的解释:

  • req: 这个命令表示进行证书请求和证书生成操作。
  • -new: 该选项指示生成一个新的 CSR。
  • -key private_key.pem: 这是指定私钥文件的选项。在这里,private_key.pem 是您事先生成的私钥文件的名称。CSR 需要与该私钥关联,以便在之后对证书进行签名时使用。
  • -out my_csr.pem: 这是指定输出 CSR 文件的选项。在这里,my_csr.pem 是生成的 CSR 将保存的文件名。

在运行命令时,您会有可能被要求提供一系列有关证书请求的信息,例如:

  • Country Name (2 letter code): 两个字母的国家/地区代码,例如 "US" 表示美国。
  • State or Province Name (full name): 州或省份的全名。
  • Locality Name (eg, city): 城市名称。
  • Organization Name (eg, company): 组织名称,通常是您的公司或组织名称。
  • Organizational Unit Name (eg, section): 组织单位名称,可选。
  • Common Name (eg, fully qualified host name): 通用名称,通常是您的域名(在TLS证书中,这是最重要的字段)。
  • Email Address: 电子邮件地址,可选。
  • A challenge password: 挑战密码,可选。
  • An optional company name: 公司名称,可选。

在提供这些信息之后,OpenSSL 将生成 CSR 文件 my_csr.pem,其中包含您提供的信息以及公钥。该文件可以提交给证书颁发机构(CA)以签名,以获得最终的数字证书。请注意,私钥文件 (private_key.pem) 应该妥善保存,而 CSR 文件可以与其他人共享(注:如有不准确请自行百度)。

进行CA认证

一旦您拥有公钥和 CSR 文件,您就可以选择两种主要方式来获取数字证书:通过证书颁发机构(CA)申请签名证书,或者自行进行自签名。

1. 向 CA 申请签名证书:

如果您计划在公共网络上使用证书(例如,用于网站的 HTTPS),通常建议使用受信任的证书颁发机构签署您的证书。这确保了您的证书能够被广泛接受,而不会被浏览器或其他客户端标记为不受信任。

步骤:

  • 将生成的 公钥 和 CSR 文件提交给证书颁发机构(CA)(CA证书颁发机构网址,请自己百度搜索)。
  • CA 将验证您的身份和提供的组织信息,并使用其私钥对您的公钥信息进行签名,生成一个数字证书。
  • 您收到由 CA 签名的证书,可以在服务器上使用它。

2. 自签名证书:

自签名证书适用于内部使用、开发和测试等场景,但在生产环境中不太适用。自签名证书没有通过受信任的第三方 CA 签名,因此在公共网络上使用时,客户端可能会提示证书不受信任。

步骤:

  • 使用您的私钥对 CSR 进行签名,生成自签名证书。
openssl x509 -req -in my_csr.pem -signkey private_key.pem -out my_certificate.pem
  • 您现在可以在您的服务器上使用生成的自签名证书。

请注意,对于生产环境,强烈建议使用受信任的 CA 签名证书,以确保您的用户和客户端能够信任您的网站或服务。自签名证书主要用于开发和测试环境,或者在一些特定场景中,不要在公共网络上使用自签名证书。

理解数据签名(数字签名)

签名的形成是基于数据摘要的,注意,目前暂时和https没有关系,不要和https中的公钥私钥搞混

  1. CA机构拥有非对称加密的私钥A和公钥A
  2. CA机构对服务端申请的证书明文数据进行hash,形成数据摘要
  3. 然后对数据摘要用CA私钥A加密,得到数字签名S

服务端申请的证书明文和数字签名S共同组成了数字证书,这样一份数字证书就可以颁发给服务端了

方案5:非对称加密 + 对称加密 + 证书认证

在客户端和服务器刚一建立连接的时候,服务器给客户端返回一个证书,证书包含了之前服务端的公钥,也包含了网站的身份信息。

客户端进行认证

当客户端获取到这个证书之后,会对证书进行校验(防止证书是伪造的)。

  1. 判定证书的有效期是否过期
  2. 判定证书的发布机构是否受信任(操作系统中已内置的受信任的证书发布机构)。
  3. 验证证书是否被篡改:从系统中拿到该证书发布机构的公钥,对签名解密得到一个hash值(称为数据摘要),设为hash1然后计算整个证书的hash值,设为hash2对比 hash1和 hash2是否相等,如果相等,则说明证书是没有被篡改过的。
中间人有没有可能篡改该证书?
  1. 中间人篡改了证书的明文
  2. 由于他没有CA机构的私钥,所以无法hash之后用私钥加密形成签名,那么也就没法办法对篡改后的证书形成匹配的签名
  3. 如果强行篡改,客户端收到该证书后会发现明文和签名解密后的值不一致,则说明证书已被篡改,证书不可信,从而终止向服务器传输信息,防止信息泄露给中间人
中间人整个掉包证书?
  1. 因为中间人没有CA私钥,所以无法制作假的证书(为什么? )
  2. 所以中间人只能向CA申请真证书,然后用自己申请的证书进行掉包
  3. 这个确实能做到证书的整体掉包,但是别忘记,证书明文中包含了域名等服务端认证信息,如果整体掉包,客户端依旧能够识别出来。
  4. 永远记住:中间人没有CA私钥,所以对任何证书都无法进行合法修改,包括自己的

查看浏览器的受信任证书发布结构

打开edge浏览器,点击右上角的

选择"设置",搜索"证书管理",即可看到以下界面.(如果没有,在隐私设置和安全性->安全里面找找)

为什么数据摘要内容在网络传输的时候一定要加密形成签名?

在网络传输过程中,为数据摘要内容加密形成数字签名的主要目的是确保数据的完整性和身份验证。以下是一些关键原因:

  1. 完整性保护: 数字签名用于验证数据在传输过程中是否被篡改。通过对数据摘要进行加密形成签名,发送者使用私钥进行签名,而接收者使用相应的公钥进行验证。如果数据在传输中被篡改,数字签名验证将失败,因此接收者会意识到数据完整性受到威胁。
  2. 身份验证: 数字签名可以用于验证数据的发送者身份。只有拥有相应私钥的发送者才能生成有效的数字签名。这种方式确保了接收者可以信任数据的来源,并防止恶意方冒充合法发送者。
  3. 防止重播攻击: 通过数字签名,可以防止重播攻击,即攻击者截获并多次发送相同的已签名数据。数字签名中包含时间戳等信息,有助于防止攻击者重复使用相同的签名。
  4. 数据保密性: 尽管数字签名本身并不提供数据的保密性,但在某些情况下,数字签名的生成可能涉及到加密操作,从而确保签名的机密性。这取决于具体的实现和使用场景。

常见的摘要算法有:MD5和SHA系列

以MD5为例,我们不需要研究具体的计算签名的过程,只需要了解MD5的特点:

  1. 定长:无论多长的字符串,计算出来的MD5值都是固定长度(16字节版本或者32字节版本)
  2. 分散:源字符串只要改变一点点,最终得到的MD5值都会差别很大。
  3. 不可逆:通过源字符串生成MD5很容易,但是通过MD5还原成原串理论上是不可能的.

正因为MD5有这样的特性,我们可以认为如果两个字符串的MD5值相同,则认为这两个字符串相同

理解判定证书篡改的过程:(这个过程就好比判定这个身份证是不是伪造的身份证)

假设我们的证书只是一个简单的字符串 hello,对这个字符串计算hash值(比如md5),结果为BC4B2A76B9719D91

如果hello中有任意的字符被篡改了,比如变成了hella,那么计算的md5值就会变化很大BDBD6F9CF51F2FD8

然后我们可以把这个字符串hello和哈希值BC4B2A76B9719D91从服务器返回给客户端,此时客户端如何验证hello是否是被篡改过?

那么就只要计算hello的哈希值,看看是不是BC4B2A76B9719D91即可。

但是还有个问题,如果黑客把 hello篡改了,同时也把哈希值重新计算下,客户端就分辨不出来了呀。

所以被传输的哈希值不能传输明文,需要传输密文。

所以,对证书明文(这里就是“hello”)hash形成散列摘要,然后CA使用自己的私钥加密形成签名,将hello和加密的签名合起来形成CA证书,颁发给服务端,当客户端请求的时候,就发送给客户端,中间人截获了,因为没有CA私钥,就无法更改或者整体掉包,就能安全的证明,证书的合法性。

最后,客户端通过操作系统里已经存的了的证书发布机构的公钥进行解密,还原出原始的哈希值,再进行校验

为什么签名不直接加密,而是要先hash形成摘要?

使用哈希函数生成摘要而不直接对整个数据进行加密签名有几个关键原因:

  1. 效率: 哈希函数通常能够生成固定长度的输出,而无论输入的数据有多大。这使得签名操作更加高效,因为只需要对相对较小的哈希值进行加密,而不是整个数据。相比之下,直接对大量数据进行加密签名可能更为耗时。
  2. 一致性: 哈希函数产生的摘要是一个固定长度的字符串,而数字签名的长度可能是可变的,取决于使用的算法和密钥长度。使用哈希函数可以确保无论原始数据有多大,都能生成固定大小的签名,方便处理和传输。
  3. 保护私钥: 数字签名中使用的加密操作通常是非对称加密,涉及公钥和私钥。私钥通常用于对较小的数据块进行签名,以减少计算开销。哈希函数生成的摘要作为签名的输入是相对较小的,从而降低了对私钥的使用频率,有助于保护私钥的安全性。
  4. 碰撞防御: 使用哈希函数可以减少碰撞的可能性。碰撞是指两个不同的输入产生相同的输出。如果直接对整个数据进行签名,存在更大的风险,因为不同的数据可能会产生相同的签名,从而引发安全问题。使用哈希函数可以减小这种风险,因为哈希函数的输出是固定长度的。

因此,通过先使用哈希函数生成摘要,可以提高效率、一致性和安全性,同时降低碰撞的风险,使数字签名更可靠。

如何成为中间人 - 了解
  1. ARP欺骗:在局域网中,hacker经过收到ARP Request广播包,能够偷听到其它节点的(IP, MAC)地址。例,黑客收到两个主机A, B的地址,告诉B(受害者),自己是A,使得B在发送给A的数据包都被黑客截取
  2. ICMP攻击:由于ICMP协议中有重定向的报文类型,那么我们就可以伪造一个ICMP信息然后发送给局域网中的客户端,并伪装自己是一个更好的路由通路。从而导致目标所有的上网流量都会发送到我们指定的接口上,达到和ARP欺骗同样的效果
  3. 假wifi &&假网站等

完整流程

左侧都是客户端做的事情,右侧都是服务器做的事情。

HTTPS工作过程中涉及到的密钥有三组

第一组(非对称加密,用的是CA密钥):用于校验证书是否被篡改.服务器持有私钥(私钥在形成CSR文件与申请证书时获得),客户端持有公钥(操作系统包含了可信任的CA认证机构有哪些,同时持有对应的公钥).服务器在客户端请求是,返回携带签名的证书.客户端通过这个公钥进行证书验证,保证证书的合法性,进一步保证证书中携带的服务端公钥权威性。

第二组(非对称加密,用的是服务器端的密钥):用于协商生成对称加密的密钥.客户端用收到的CA证书中的公钥(是可被信任的)给随机生成的对称加密的密钥加密,传输给服务器,服务器通过私钥解密获取到对称加密密钥.

第三组(对称加密,用的是客户端的对称秘钥):客户端和服务器后续传输的数据都通过这个对称密钥加密解密。

其实一切的关键都是围绕这个对称加密的密钥.其他的机制都是辅助这个密钥工作的.第二组非对称加密的密钥是为了让客户端把这个对称密钥传给服务器。

第一组非对称加密的密钥是为了让客户端拿到第二组非对称加密的公钥。

  • 28
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值