Network 之九 对称加密、非对称加密、HASH、CA 证书签发及使用流程

  在上一篇博文 Git 之七 详解 Github、Gitee 配置 SSH、GPG 及 使用方式 中就有提到过 GPG、CA 这些概念,今天就来简单学习一下加密相关的内容。由于我并不从事加密相关工作,对于加密算法本身并不了解,本文主要还是学习一下一些概念及使用。

  随着信息化和数字化社会的发展,人们对信息安全和保密的重要性认识不断提高,在 1997 年,美国国家标准局公布实施了“美国数据加密标准(DES)”。如今,DES、RSA、SHA 等密码学算法一直在被全面研究及应用。

密码学

  密码学(Cryptography)可分为古典密码学和现代密码学。古典密码学主要关注信息的保密书写和传递,以及与其相对应的破译方法。而现代密码学不只关注信息保密问题,还同时涉及信息完整性验证(消息验证码)、信息发布的不可抵赖性(数字签名)、以及在分布式计算中产生的来源于内部和外部的攻击的所有信息安全问题。

  我们日常生活中所说的 “加密”,通常就是指的现代密码学。其中包括了 加密、解密、消息摘要等,而不是单单指字面含义 “加密”。例如,我们说的对称加密,既有加密过程,也有解密过程。

对称加密

  对称加密又叫私钥加密、共享密钥加密,是密码学中的一种加密法之一。加密双方使用的同一个密钥,既可以加密又可以解密。在 20 世纪 70 年代中期之前,所有密码系统都使用对称加密。目前,几乎所有现代加密系统仍然在内部使用对称加密来加密大部分消息。
在这里插入图片描述
  对称加密使用的算法又叫对称密钥算法,常见的对称密钥算法主要有 AES、ChaCha20、3DES、Salsa20、DES、Blowfish、IDEA、RC5、RC6、Camellia。

非对称加密

  非对称加密又叫公钥加密,也是密码学中的一种加密法之一。加密密钥是由公钥和私钥组成的一对密钥,加密双方分别使用其中一个。私钥可以解密公钥加密的数据,公钥可以解密私钥加密的数据。
在这里插入图片描述
  非对称加密使用的算法也叫非对称密钥算法,常见的非对称密钥算法主要有 RSA、ECC(移动设备用)、ElGamal、Rabin(RSA 的特例)、DSA(数字签名用)、ECDSA 等。

消息摘要

  消息摘要(Digest)又叫指纹、哈希值、杂凑值、散列值,是指对任意长度的一组输入数据进行计算,得到一个长度较短的固定长度的输出摘要。消息摘要最重要的特点就是相同的输入一定得到相同的输出,不同的输入极大概率得到不同的输出
在这里插入图片描述
  消息摘要主要使用消息摘要算法,又叫哈希算法(Hash)、散列算法 ,常见的消息摘要算法主要有 MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1 等。

  严格来说,消息摘要(算法)并不属于加密(算法)。因为,有加密就要有对应的解密,而消息摘要(算法)是不可逆(会导致信息熵减小)。因此,消息摘要(算法)是与加密(算法)应该属于并列关系。

应用

  在计算机世界中,对称加密目前一般用于各种服务内部,而非对称加密则主要用在在网络通信中。而且,无论哪种加密,一般都配合消息摘要一起使用。GPG 文档对于密钥用途的总结基本就对应了我们平时的应用场景(主要是非对称加密):

简写 能力(Capability)/用途(Usage) 说明 常见应用举例
[C] Certificating 认证其他密钥、给其他密钥签名 SSL/TLS 根证书可以认证其他证书
[S] Signing 给文件添加数字签名 软件的数字签名、git commit 的签名
[A] Authenticating 身份验证、鉴权 SSH 登陆
[E] Encrypting 对明文进行加密、解密 消息内容加密,文件内容加密

  其中的 Certificating 涉及到信任链的问题。当前网络世界中,信任链有两大代表:CA 和 GPG。CA 属于集中式的信任链,而 GPG 并不搞集中式,虽然开源世界中有不少 GPG 公共服务器组成的【公钥服务器池】(Web of Trust),但 GPG 将信任与否的决定权交给用户。

  1. GPG:相信你所相信的人(Web of Trust)。简单来说,就是大家都把自己的公钥放到一个互联网上(例如,GPG 提供的 https://keys.openpgp.org/),好让别人都知道自己。这样在双方通信的时候,只要使用对方的公钥验证信息通过就可以确认对方身份。
    在这里插入图片描述
  2. TLS:相信权威(CA)。CA 的根证书一般都已内置于操作系或浏览器中,根证书是无条件信任的。因为信任根证书,因此,也要信任根证书认证的其他证书。
    在这里插入图片描述

CA

  CA 全称 Certificate Authority,中文是证书认证机构,也称为证书中心 或 证书授权中心或电子认证服务机构,是足够权威的受公众信任第三方机构,负责管理和签发证书。

  CA 本身还有很多代理商,因为,如果全部都有根证书来进行认证,显然是无法处理当前互联网众多的证书需求。所以,我们看到的一些证书有可能是一些二三级 CA 代理商签发的证书。
在这里插入图片描述
  目前,全球主流的 CA 机构(一级)有 Comodo、Symantec、GeoTrust、DigiCert、Thawte、GlobalSign、RapidSSL 等,其中,Symantec、GeoTrust 都是 DigiCert 机构的子公司。

  1. 还有一些不知名的证书机构也是可以颁发数字证书的
  2. 我们通常接触的证书,基本都是二级、三级 证书。

CA 证书

   CA 证书又被称为 数字证书,顾名思义,就是由 CA 颁发的证书。这个证书里面包含了 签证机关的信息、证书拥有者信息、证书拥有者的公钥、权威机构的签字和有效期 等信息。目前,市场上主流的证书品牌是 Comodo 证书、Symantec 证书、GeoTrust 证书、Thawte 证书和 RapidSSL 证书。
在这里插入图片描述
  CA 证书就是一个使用 .pem(openssl 默认格式,PEM 编码的文件)或 .crt ( Unix/Linux,DER 或 PEM 编码都可以) 或 .cer(windows,二进制)或 .der(二进制)后缀的文件;密钥文件通常使用 .key 后缀;CA 证书签名请求文件(CA 证书申请文件)通常使用 .req.csr(certificate signing request) 后缀。

  CA 证书、key 文件、CA 证书签名请求文件(CA 证书申请文件)有 PEM 编码(,文件内容是由 -----BEGIN XXXX-----" 开始,"-----END XXXX----- 结束 + BASE64 编码的 ASCII 文件) 和 DER 编码(二进制文件)两种格式。CA 证书、key 文件、CA 证书签名请求文件必须要使用同样的编码格式。

x509

  X.509 是一种非常通用的证书格式。所有的证书都符合 ITU-T X.509 国际标准,因此,(理论上)为一种应用创建的证书可以用于任何其他符合 X.509 标准的应用。目前,使用最广泛的标准为 ITU 和 ISO 联合制定的 X.509 的 v3 版本规范(RFC5280)。

  X.509 证书的结构是用 ASN1(Abstract Syntax Notation One) 进行描述数据结构,并使用 ASN.1 语法进行编码。

Web 认证

  Web 认证主要就是我们常说的 SSL/TLS 证书认证,SSL/TLS 证书 就是 CA 证书的一种用途的名称,是 CA 证书的一大类应用。当用户访问服务器时,服务器会将 SSL/TLS 证书 发送给用户,用户浏览器则验证服务器提供的 SSL/TLS 证书是否正确,只有正确时才继续通信,从而确保安全。
在这里插入图片描述
  首先,服务器的 SSL/TLS 证书是由网站的所有者向 CA 申请的。需要注意的是,任何人都可以获取服务器的证书,为了防止证书被别人套用(比如我部署自己的服务器,套用谷歌的证书),所申请的 SSL/TLS 证书是直接绑定服务器的域名的。
在这里插入图片描述
  其次,浏览器如何核对这些证书呢?在浏览器中,都内置了主流 CA 的根证书。当收到服务器的 CA 证书后,浏览器就会用自己内置的 CA 根证书去验证收到的服务器的 CA 证书。其实,浏览器内置的 CA 就是操作系统中的 CA。
在这里插入图片描述
浏览器支持用户自己导入 CA 证书,这样可以避免一些浏览器的告警,可以本地自我安慰!

软件认证

  软件认证就是软件添加数字签名,是 CA 证书的y又一大类应用。当我们下载安装软件时,操作系统就会检查软件的数字签名。数字签名是用数字证书(CA 证书)对电子文件签名后在电子文件上保留的签署结果。如果说数字证书是公章,那么数字签名是文件上的用公章盖的那个戳。

数字签名不只是用于软件认证,只是软件认证通常也是采用 CA 证书进行数字签名(至少 Windows 是这样,MacOS 没怎么接触过),因此,这里放在一块。

  在操作系统中,都内置了主流 CA 的根证书。当我们下载安装软件时,操作系统就会使用内置的 CA 根证书去校验软件的 CA 证书。如果不通过会给出提示。 Windows 内置的 CA 根证书可以通过 certmgr.msc 查看。linux 则没有固定的程序可以查看 CA 根证书(awk -v cmd='openssl x509 -noout -subject' ' /BEGIN/{close(cmd)};{print | cmd}' < /etc/ssl/certs/ca-certificates.crt)。
在这里插入图片描述

操作系统支持用户自己安装 CA 证书,可以本地自我安慰!

签发及使用

  OpenSSL 内置了一个完整的签发 CA 证书的功能,我们可以通过 OpenSSL 来学习 CA 证书的签发流程。这里我们通过 CA(根证书) - Server(服务器 CA 证书)- Client(浏览器) 这三者来简单介绍 CA 证书的签发及使用。

  注意,OpenSSL 官方默认没有提供预编译的二进制安装包。Linux 可以从发行版仓库安装(例如 Ubuntu sudo apt-get install libssl-dev);Windows 下可以从 https://slproweb.com/products/Win32OpenSSL.html 下载别人编译好的安装包进行安装。

CA 根证书

  顶级 CA 的 CA 证书是自签名的。低级 CA 机构要向更高级的 CA 机构申请证书,有了自己的证书之后才能为其他用户签发证书。低级 CA 机构的申请 CA 证书流程与用户服务器申请 CA 证书流程是一样的,区别在于 低级 CA 的 CA 证书签名请求文件中部分内容(Organization Name)要求与 顶级 CA 根证书一致。

  使用 OpenSSL 生成 CA 证书成流程及命令都是一样的,这里我们先简单看看 CA 根证书的生成,再后面的服务器 CA 证书在来详细介绍整个过程。

  1. 生成自己的私钥:openssl genrsa -out ca.key 2048ca.key 这个文件就是 CA 自己的私钥,通常用来认证其他 CA 证书。
    在这里插入图片描述
  2. 生成向 CA 申请证书的请求文件:openssl req -new -key ca.key -out ca.csr。这里会要求输入自己的信息,后面我们详细说明。对于顶级 CA 来说,这个文件就是为了将自己的信息与 CA 证书绑定。对于低级 CA,其中的某些信息(Organization Name)必须与顶级 CA 一致。
    在这里插入图片描述
  3. 生成 CA 证书:openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt。最终生成的 ca.crt 就是顶级 CA 的证书,也就是我们说的 CA 根证书。以后,CA 就可以用 ca.crt 来给其他人签发 CA 证书了。
    在这里插入图片描述
    对于低级 CA,顶级 CA 会以它自己的 CA 根证书给低级 CA 的根证书进行签名认证。此后,低级 CA 就可以给客户签发 CA 证书了。

服务器 CA 证书

  如果我们搭建了自己的服务器,想要获取一个 CA 证书,就需要向 CA 进行申请,申请的价格根据安全等级的不同而不同,反正是不便宜。有了 CA 证书,在我们向用户提供服务时,就可以得到用户的认可。实际上,我们完全可以自己生成 CA 证书(自己就是 CA),但是我们自己不是权威,不会被其他人认可。
在这里插入图片描述

  1. 生成自己的私钥。这个私钥可以在以后用来加密服务器通信时的数据。命令:openssl genrsa -out server_private.key 2048,此时在我们当前目录下就会生成 server_private.key 这个文件。
    在这里插入图片描述
      实际上,上面的的命令生成的 server_private.key 中既有私钥也保存了公钥。使用命令 openssl rsa -in server_private.key -pubout > server_public.pub 就可以将其中的公钥提取出来放到 server_public.pub 中。
    在这里插入图片描述
      这里需要注意,在实际应用中,密钥总是成对(一个公钥和一个私钥)存在的。公钥和私钥一一对应,不存在一个公钥对多个私钥,也不存在一个私钥对多个公钥。但是在数学上,公钥和私钥可以不一一对应,这取决于算法本身。还要注意,不能通过私钥算出公钥,也不能通过公钥算出私钥。
  2. 生成向 CA 申请证书的请求文件。命令:openssl req -new -key server_private.key -out server.req 就会生成请求文件 server.req。这其中会要求我们输入一些个人信息。
    在这里插入图片描述
      server.req 这个文件就包含了服务器的相关信息以及服务器的公钥。使用命令 openssl req -in server.req -text 就可以查看请求文件的内容。
  3. 将上面生成的 server.req 发送给 CA,然后根据请求的 CA 类型付款。此后,CA 会通过各种手段验证请求者的信息。
  4. 在验证过 server.req 的信息之后,CA 用自己的 CA 证书 ca.pem 和 私钥 ca.keyserver.req 请求文件签名,生成请求者的证书:openssl x509 -req -in server.req -CA ca.crt -CAkey ca.key -days 365 -CAcreateserial -out server.crt
    在这里插入图片描述
      具体的生成方法是:首先,通过 CA 自己的 CA 根证书向 server.req 中添加 CA 自己的信息,然后,使用散列函数计算公开的明文信息的信息摘要,再然后,使用 CA 的私钥 ca.key 对信息摘要进行加密,密文就是证书的签名。
  5. 将上面生成的 server.crt 返回给 CA 证书请求者( server.req 的发送者) ,这个 server.crt 就是我们申请的 CA 证书。使用命令 openssl x509 -in server.crt -noout -text 可以查看 CA 证书的内容;使用命令 openssl x509 -in server.crt -noout -pubkey 可以查看 CA 证书的公钥。
    在这里插入图片描述
      在实际使用中,通常会要求采用 .pem 格式的 CA 证书文件。可以用以下方式合并证书文件(crt)和私钥文件(key)来生成:cat server.crt server_private.key > server.pem

客户浏览器

  当用户访问服务器时,服务器会将浏览器 server.crt 发送给用户的浏览器,浏览器通过检查 server.crt 中的信任链,就可以找到最终的 CA 根证书。然后,浏览器就会使用找到的 CA 根证书来验证 server.crtopenssl verify -CAfile ca.crt server.crt
在这里插入图片描述
  具体的验证过程是:首先客户端会使用同样的 Hash 算法获取该证书的 Hash 值 HASA_1,然后,从找到的 CA 根证书中提取 CA 公钥解密证书里的 Hash 值 HASA_2,然后将 HASH_1 与 HASH_2 做对比,在一致的前提下,再去验证证书的有效期、域名等信息。
在这里插入图片描述
  这里有个问题需要注意,浏览器或者操作系统只默认内置了顶级 CA 的证书(即 CA 根证书),如果收到的证书是低级 CA 签发的,那么浏览器就会向 CA 请求该中间证书,依次找到最终的根证书。至此一条新的信任链就被建立了。实际使用中的 CA 证书一般都是二级或三级 CA 证书。
在这里插入图片描述

最终示例

  在整个 CA 证书签发及验证过程中,只有公钥在网络传递,不需要服务器的私钥参与,服务器的私钥只有服务器知道,这样进一步保证了安全。
在这里插入图片描述
其他一些 OpenSSL 常用操作:

  1. 打印出证书的系列号:openssl x509 -in server.crt -noout -serial
  2. 打印出证书的拥有者名字:openssl x509 -in server.crt -noout -subject
  3. 以 RFC2253 规定的格式打印出证书的拥有者名字:openssl x509 -in server.crt -noout -subject -nameopt RFC2253
  4. 打印出证书的 MD5 特征参数:openssl x509 -in server.crt -noout -fingerprint
  5. 打印出证书有效期:openssl x509 -in server.crt -noout -dates
  6. 打印出证书公钥:openssl x509 -in server.crt -noout -pubkey
  7. PEM 转 DER 格式:openssl x509 -inform pem -in server.pem -outform der -out server.der
  8. DER 转 PEM 格式:openssl x509 -inform der -in server.der -outform pem -out server.pem
  9. 公钥加密:openssl rsautl -encrypt -in test.txt -inkey server_public.pub -pubin -out test_encrypt.txt
  10. 私钥解密:openssl rsautl -decrypt -in test_encrypt.txt -inkey server_private.key -out test_decrypt.txt

参考

  1. https://www.cnblogs.com/frisk/p/12628159.html
  2. https://blog.csdn.net/cowbin2012/article/details/100134114
  3. https://linkscue.com/posts/2019-06-26-ca-and-self-signed-certificates/
  4. https://www.manageengine.com/key-manager/information-center/certificate-authority-ca.html
  5. https://www.cnblogs.com/handsomeBoys/p/6556336.html
  6. https://blog.csdn.net/lk2684753/article/details/100160856
  7. https://segmentfault.com/a/1190000021494676?_ea=29363371

猜你喜欢

转载自blog.csdn.net/ZCShouCSDN/article/details/127131451
今日推荐