Code前端首页关于Code前端联系我们

公钥、私钥、SSL/TLS、会话密钥、DES、识字贴纸

terry 2年前 (2023-09-28) 阅读数 62 #未命名

1、公钥私钥
1、公钥和私钥成对出现
2、公钥称为公钥,只有你知道的称为私钥
3. 用公钥加密的数据只能用对应的私钥解密
4. 用私钥加密的数据只能用对应的私钥解密公钥
5、如果用公钥可以解密,则一定是用对应的私钥加密
6、如果用私钥能解密,则一定是用对应的私钥加密公钥

想象一下,我找到了两个数字,一个是1,另一个是2。我喜欢数字2,所以我保留它,不会告诉你。然后我会告诉你1是我的公钥。
我有一个文件,别人看不到,所以用1加密。别人发现了这个文件,但他不知道2是解密的私钥,所以无法解密。只有我可以使用数字 2(我的私钥)来解密它。这样我就可以保护数据。

我的好朋友x用我的公钥1加密了字符a,加密后变成了b,放到网上。其他人窃取了这个文件,但他们无法解密,因为他们不知道2是我的私钥。只有我才能解密。解密后我得到一个。这样我们就可以传输加密数据了。

现在我们知道,使用公钥加密,然后使用私钥解密,可以解决安全传输的问题。如果我用私钥加密一段数据(当然只有我可以用私钥加密,因为只有我知道2是我的私钥),每个人都会看到我的内容,因为他们都知道我的公钥。是1那么这个加密有什么用呢?

但是我的好朋友x说有人冒充我给他发了一封信。怎么做?我用我的私钥2加密了我要发送的信,内容为c,加密后的内容是d,发送给x,然后让他解密看看是不是c,他用我的私钥解密了公钥1,发现居然是c,此时他就会认为用我的公钥能解密的数据一定是用我的私钥加密的。只有我知道我的私钥,所以他可以验证确实是我发送的。这样我们就可以确认发件人的身份。这个过程称为数字签名。当然,具体过程要复杂一些。使用私钥对数据进行加密以进行数字签名。 OK 4.用我的公钥解密信件内容,看看能否解密。如果可以,这意味着它是用我的私钥加密的,你可以验证它确实是我发送的。

二,SSL
我和我的好朋友x想要安全地通信。这种交流方式可以是QQ聊天,这种方式非常频繁。用我的公钥加密数据是行不通的,因为:
1.我的好朋友x没有公钥和私钥对,我如何向他发送加密消息? (注:实际情况中,双方可能都有公私钥对)
2、公私钥加密操作耗时且慢,影响QQ效果。

好吧,我的好朋友,我解决之后,得到了数字3。这样,只有我们两个人知道秘密数字3,其他人都不知道,因为他们不知道x选了哪个数字,他们无法破译加密的内容。我们将此秘密号码称为会话秘密。钥匙。

然后我们选择对称密钥算法,比如DES,(对称算法是指加密过程和解密过程是对称的。用一个密钥加密可以用同一个密钥解密。使用公钥和私钥算法是一种非对称加密算法)来加密我们之间的通信内容。其他人无法解密,因为他们不知道3是我们的会话密钥。 OK 3、双方使用会话密钥对双方的通信内容进行加密

以上就是原理。你可能会觉得很复杂,但实际使用中比这还要复杂。幸运的是,好心的先驱们已经在操作系统或相关软件中实现了这一层(Layer),并给它起了一个丑陋的名字,叫做SSL(Secure Socket Layer)

  SSL(Secure Sockets Layer)层),以及它的后继者Transport层安全性 (TLS) 是一种为网络通信提供安全性和数据完整性的安全协议。 TLS 和 SSL 在传输层加密网络连接。通常,应用程序使用单向身份验证。如果应用场景需要验证客户来源,也可以实现为双向认证。

为了更好的理解和了解SSL协议,这里重点介绍一下SSL协议的握手协议。 SSL协议同时使用公钥加密技术和对称加密技术。虽然对称加密技术比公钥加密技术速度更快,但公钥加密技术提供了更好的身份认证技术。SSL握手协议非常高效地让客户端和服务器完成相互身份认证。主要流程如下:

①客户端浏览器将客户端SSL协议版本号和加密算法类型发送给服务器。生成的随机数,以及服务器和客户端之间通信所需的其他各种信息。
② 服务器端向客户端传输SSL协议版本号、加密算法类型、随机数等相关信息。同时,服务器端也会将自己的证书传输给客户端。
③ 客户端利用服务器发送的信息来确认服务器的合法性。服务器的合法性包括:证书是否过期、颁发服务器证书的CA是否可信、颁发者证书的公钥是否可以正确解锁服务器证书。颁发者数字签名”,如果服务器证书的域名与服务器的实际域名匹配。如果合法性验证失败,则通信断开;如果合法性验证通过,则继续第四步。
④客户端随机生成一个“对称密码”用于后续通信,然后用服务器的公钥进行加密(服务器的公钥是在步骤②中从服务器的证书中获取的),然后将加密后的“预主密码”发送至服务器
⑤ 如果服务器需要客户端的身份认证(握手过程中可选),用户可以创建一个随机数,然后对其进行数据签名,并将这个签名的随机数与客户端自己的证书结合起来加密后的“预主密码”也发送到服务器
⑥ 如果服务器要求客户端进行身份认证,服务器必须验证客户端证书和签名随机数的合法性。具体的合法性验证过程包括:客户端的证书有效期是否有效,以及为客户端提供证书的CA是否可信。如果发证 CA 的公钥可以正确解密客户证书上的发证 CA 的数字签名,请检查客户的证书是否在证书吊销列表 (CRL) 中。如果验证失败,通信立即中断;如果验证通过,服务器会使用自己的私钥解密加密的“预主密码”,然后执行一系列步骤生成主通信密码(客户端也会通过相同的方法生成)主通讯密码)。
⑦ 服务器端和客户端使用相同的主密码,即“呼叫密码”。对称密钥用于SSL协议中安全数据通信的加密和解密。同时,在SSL通信过程中必须完成数据通信的完整性,防止数据通信被改变。
⑧ 客户端向服务器发送消息,表示步骤⑦中的主密码将作为对称密钥用于后续的数据通信,通知服务器客户端的握手过程已完成。
⑨ 服务器向客户端发送消息,表示步骤⑦中的主密码将作为对称密钥用于后续的数据通信,通知客户端服务器端握手过程已完成。
⑩ SSL 的握手部分结束,开始与安全 SSL 通道进行数据通信。客户端和服务器开始使用相同的对称密钥进行数据通信,同时检查通信的完整性。

双向认证SSL协议的具体流程
  ①浏览器向安全服务器发送连接请求。
② 服务器将自己的证书以及与证书相关的信息发送给客户端浏览器。
③客户端阅读器检查服务器发送的证书是否是其信任的CA中心颁发的。如果是,则继续执行协议;如果不是,客户端的浏览器将向客户端发出警告消息:警告客户端该证书不可信,并询问客户端是否必须继续。
然后客户端浏览器将证书中的域名、公钥等信息与服务器刚刚发送的相关消息进行比较。如果一致,则客户端浏览器识别服务器的合法身份。
⑤ 服务器要求客户端发送客户端自己的证书。服务器收到后,验证客户端的证书。如果验证失败,则拒绝连接;如果验证通过,服务器就得到用户的公钥。
⑥ 客户端浏览器告诉服务器它可以支持哪种通信对称加密方案。
⑦ 服务器在客户端发送的密码方案中选择加密程度最高的密码方案,用客户端的公钥加密并通知浏览器。
⑧ 浏览器为此密码设置选择一个呼叫密钥,然后使用服务器的公钥对其进行加密并将其发送到服务器。
⑨ 服务器接收浏览器发送的消息,用自己的私钥解密并检索调用密钥。
⑩ 后续服务器与浏览器之间的通信采用对称加密方案,并对对称密钥进行加密。
以上描述的是SSL协议进行双向认证的具体通信过程。这种情况要求服务器和用户都拥有证书。 SSL 单向身份验证协议不要求客户端拥有 CA 证书。具体过程与上面的步骤进行对比。只需要去掉服务器端验证客户端证书的过程,在协商对称加密方案和对称调用密钥时,由服务器发送给客户端。是未加密的(这不会影响SSL过程的安全性)密码方案。这样,双方的具体通信内容就是加密数据。如果有第三方攻击,只能得到加密后的数据。如果第三方想要获得有用的信息,就必须对加密的数据进行解密。此时的安全性是依赖于密码方案的安全性。幸运的是,只要通信密钥足够长,目前使用的加密方案就足够安全。这就是为什么我们强调要求使用128位加密通信。

证书

OpenSSL构建自己的CA

(1)环境准备

首先准备一个目录来放置颁发的CA证书文件,包括CRL(Revolution List ofcertificates) )。
这里我们选择目录/var/MyCA。

然后我们在/var/MyCA下创建两个目录,certs用于存放我们CA颁发的所有证书的副本; private 用于存储CA证书的私钥。

除了生成密钥之外,还必须在我们的 CA 系统中创建三个文件。第一个文件用于跟踪最近颁发的证书的序列号。我们将其称为序列并将其初始化为 01。第二个文件是一个排序数据库,用于跟踪已颁发的证书。我们命名它,文件内容为空。

$ mkdir /var/MyCA
$ cd /var/MyCA
$ mkdir certs private
$ chmod g-rwx,o-rwx private $ touch

第三个文件是 OpenSSL-配置文件,创建起来有点困难。示例如下:

$ 触摸文件内容如下:

[ca]
default_ca = myca

[myca]
dir = /var /myca
certificate = $ dir/
数据库 = $dir/
new_certs_dir = $dir/certs
private_key = $dir/private/
序列 = $dir/serialr_7 default_days = 365 default_md = md5

policy = myca_policy
国家名称 = 提供的♷ 电子邮件地址 组织名称 组织单位名称 = 可选

[ 证书扩展 ]
basicConstraints= CA :false
[ 要求 ]
default_bits = 2048
default_keyfile = /var/MyCA /private/
standard_md = md5❀no distinguished_name = root_ca_distinguished_name
stateOrProvinceName = HZ
国家/地区名称 = CN
电子邮件地址s = test@
organizationName = Root Certification Authority
[ root_ca_extensions ]
basicConstraints = CA:true

(2)生成要颁发根证书自己颁发根证书)❝证书签名,这个证书可以从其他CA获取,也可以是自签名根证书。这里我们生成一个自签名的根证书。

$ openssl req -x509 -newkey rsa -out -outform PEM -days 356 -config

验证我们生成的文件。

$ openssl x509 -in -text -noout

生成结果:
private/为CA证书的私钥文件,
为CA证书。

创建用于CA签名的CA私钥和公钥文件
[root@]#openssl genrsa -des3 -out ca.key 1024
//密钥文件需要密码(请输入您想要的内容,其中可能与指定的PEM密码不同)
[root@]#openssl req -new -x509 -days 18250-key ca.key -out ca.crt
//需要密码和证书信息。输入的密码必须与正在使用的密钥文件的密码匹配,否则会出现错误。

您还必须输入证书信息。完成公钥生成。

2。创建服务器证书

a。生成服务器私钥()
[root@localhost ssl.crt]#openssl genrsa -des3 -out 1024
输入加密密码(.password),使用128位rsa算法密钥文件分发时需要客户端密钥。
b. 生成服务器证书请求 ()
[root@localhost ssl.crt]#openssl req -new -key -out
此处所需的 CommonName 必须与用于访问您的 URL 完全相同通过浏览器访问网站。 ,用户会发现你的服务器证书的通用名与网站的名称不符,用户就会怀疑你的证书的真实性。它可以是域名或IP地址。
c. 生成服务器公钥(证书)
[root@localhost ssl.crt]#openssl ca -in -days 18250 -out server.crt -cert ca.crt -keyfile ca.key -config

d.查看并验证证书信息

[root@localhost ssl.crt]#openssl x509 -noout -text -in server.crt //查看证书信息
[root@localhost ssl.crt]#openssl ca verify -CA .crt server.crt //验证证书信息

确保验证通过,没有任何错误或警告信息。否则,在使用过程中可能会出现错误。

3。创建客户端证书

a。生成客户端私钥()
[root@localhost ssl.crt]#openssl genrsa -des3 -out 1024
使用128位rsa算法密钥文件输入加密密码(.password) 这个❝密码是分发客户端密钥时需要。
b. 生成客户端证书请求 ()
[root@localhost conf]#openssl req -new -key -out
通用名称可以随机选择。
c. 生成客户端的公钥(证书)
[root@localhost ssl.crt]#openssl ca -in -days 18250 -out client.crt -cert ca.crt -keyfile ca.key -config 将证书转换为浏览器可识别的格式:
[root@conf]#openssl pkcs12 -export -clcerts -in client.crt -inkey -out client.p12

必须输入导出密码,你可以和Key文件的密码不同。在客户端部署KEY文件时需要该密码。
d、
[root@localhost ssl.crt]#openssl x509 -noout -text -in client.crt //查看证书信息
[root@localhost ssl.crt] .crt client.crt / / 验证证书信息

确保验证没有任何错误或警告消息。否则,在使用过程中可能会出现错误。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门