PKI - 数字签名与数字证书

概述

SSL是一种安全协议,用于在网络传输中提供数据加密、身份验证和完整性保护。它基于传输层协议(如TCP),并为其提供加密和安全功能。

  1. 对称加密和非对称加密
    • 对称加密:使用相同的密钥进行加密和解密。
    • 非对称加密:使用两个密钥:公钥用于加密,私钥用于解密。
  2. 数字签名:用于验证数据的完整性和身份验证。发送方使用私钥对数据签名,接收方使用公钥验证签名。
  3. 数字证书:由可信第三方颁发的电子文档,其中包含有关个人或组织的身份信息以及公钥。
  4. SSL协议:基于这些工具和概念,SSL协议提供了以下几个关键功能:
    • 数据加密:通过使用非对称加密算法(如RSA或Diffie-Hellman),为传输的数据提供端到端加密。
    • 身份验证:服务器向客户端证明其身份,通常通过使用数字证书。
    • 密钥交换:协商一个共享的加密密钥,用于对称加密算法(如AES)。
    • 数据完整性:通过使用消息认证码(MAC),确保数据在传输过程中没有被篡改。
  5. 应用场景: SSL在网络交易、银行、电子邮件和许多其他需要保护敏感信息的场景中广泛使用。
  6. 替代品:由于SSL的某些安全问题,其后续版本TLS(传输层安全)已成为其替代品。TLS被认为是更安全和更现代的协议。

要充分利用SSL/TLS提供的保护,需要正确配置和管理服务器和客户端。此外,定期更新和检查证书也是非常重要的,以确保安全性和有效性。


在了解ssl之前,先要了解对称加密、非对称加密、数字签名、数字证书。因为ssl是基于这些构建出来的。

对称加密

  • 对称加密只有一把密钥,明文用这把密钥加密后可以转化为密文,密文再用同一把钥匙解密。就像家里门锁,只能有一把钥匙打开或者锁上。当然可以拿这把钥匙去配多把一样的给多个人用,这样拿到这个钥匙的人都能对门进行锁上和打开操作。
  • 常用的对称加密算法有DES、3DES、AES等。
  • 对称加密的优点是加密速度快,适合对大量信息进行加密,缺点是密钥一旦丢失将导致密文泄漏。

非对称加密

非对称加密有两把钥匙对,A和B,用A加密只能用B解密,用B加密也只能用A解密。有一把钥匙可以公开出去,另一把钥匙自己留着,公开出去的叫公钥,自己留着的钥匙叫私钥。

比如A钥匙自己留着,钥匙A叫私钥,B钥匙公开出去则叫公钥。公钥可以复制多把给很多人用。

使用两把密钥:公钥和私钥。公钥用于加密,而私钥用于解密。这种方法的优点在于,即使公钥被泄露,只要私钥保持安全,信息仍然是安全的。因此,非对称加密在密钥管理上更为安全。然而,它的缺点是加密速度慢,不适合对大量信息进行加密。

常用的非对称加密算法有RSA、ECC等。

在实际应用中,通常会将对称加密和非对称加密结合使用,以提高安全性和效率。例如,可以使用非对称加密来安全地交换对称加密的密钥,然后使用对称加密来加密实际的数据。这样既可以利用对称加密的高速性,又可以保证密钥交换的安全性。


数字签名

数字签名是一种电子签名,通常用于验证消息的真实性和完整性。它是一种数学算法,利用公钥加密领域的技术实现。数字签名创建个人或实体独有的虚拟指纹,用于识别用户并保护数字消息或文档中的信息。

在数字签名的过程中,发送方会用一个哈希函数从报文文本中生成报文摘要,然后用自己的私人密钥对这个摘要进行加密。这个加密后的摘要将作为报文的数字签名和报文一起发送给接收方。接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要,再用发送方的公用密钥来对报文附加的数字签名进行解密。如果这两个摘要相同,接收方就能确认该数字签名是发送方的,从而验证消息的真实性和完整性。

数字签名是非对称密钥加密技术与数字摘要技术的应用,通常用于电子邮件、信用卡交易或数字文档等场景。它比其他形式的电子签名更安全,因为只有信息的发送者才能产生别人无法伪造的一段数字串,这个数字串同时也是对信息的发送者发送信息真实性的一个有效证明。

举个例子:

张三要求李四给他写一封加密信,打算用非对称加密方法。张三自己先生成一对密钥A和B,A作为私钥留给自己,B作为公钥给了李四。李四收到李四的公钥后就开始写信,并用李四给的公钥B对信进行加密。李四把写好的信邮递给了张三,张三用自己的私钥解开信件。

张三收到李四的信后会有两个疑问:

  • 1、这封信的内容怎么证明没有被篡改过?
  • 2、怎么证明这个信是李四写的,难道不是别人冒充的?

要解决这两个问题就要用到数字签名技术了。

主要步骤如下:

李四:

  • 1、李四生成一对密钥C和D,C作为私钥留给自己,D作为公钥给张三
  • 2、李四写完信后对信的内容用Hash函数对信生成一段摘要,把这段摘要用私钥C加密后付在信的后面一起发给张三。

张三:

  • 1、收到信后先用自己的私钥把信解出来,并用hash生成摘要
  • 2、用李四的公钥把摘要密文解出来,跟自己生成的摘要进行对比,如果一致则说明信没有被篡改过,而且可以肯定这封信就是李四写的。

由此可见,数字签名是利用信息摘要和非对称加密证明信息的完整性(没被篡改)和信息发送方的身份的一种技术。


数字证书

数字证书是一种用于验证网络通信中各方身份信息的电子文档,也称为数字标识。它是由权威的第三方机构(CA)颁发的,通常采用国际标准X.509格式。数字证书中包含了一系列关于证书所有人的信息,如姓名、公钥、有效期等,以及CA的签名。

数字证书基于密码学原理,利用数字签名、加密、解密等技术,在Internet上建立起有效的信任机制。其主要功能包括:在网络通信中标识通讯各方身份信息;对网络用户在计算机网络交流中的信息和数据进行加密或解密,保证信息和数据的完整性和安全性。

数字证书的格式遵循ITUTX.509国际标准,包含证书版本信息、序列号、签名算法、发行机构名称、有效期、证书所有人名称、公开密钥等信息。用户在浏览网络数据信息或进行网上交易时,可以利用数字证书保障信息传输及交易的安全性。

数字证书是目前国际上最成熟并得到广泛应用的信息安全技术之一。通过数字证书,可以在网络上建立起可信的虚拟世界,保障网络通信的安全性。


继续上面的案例 :

王五想冒充李四给张三写封信,他偷偷拿了张三的电脑,把里面李四的公钥D换成他自己的,然后用自己的私钥对信件摘要加密,用张三的公钥B对信件内容加密。把这封冒牌信发给张三。

怎么解决这种偷梁换柱的问题呢?张三只要证明李四给的公钥就是李四本人的就行。张三要求李四拿他的公钥去公证处做一下公证,然后将公钥以数字证书的形式发给张三。


根证书

根证书是数字证书的一种,也称为根CA证书或根CA证书颁发机构。根证书是数字证书体系的基础,它是全球数字证书体系的层次。根证书的作用是验证其他数字证书的真伪,从而确保安全通信的可靠性。

根证书由全球的数字证书颁发机构(CA)发行,例如Symantec、DigiCert、Comodo等。数字证书颁发机构通过签名和验证数字证书,为网络通信提供了一定的安全保障。数字证书颁发机构颁发的证书,都被数字签名,并被公钥体系结构加密,以确保其完整性和真实性。

根证书的作用是建立信任链,确保用户与网站或服务之间的通信是安全和可信的。当用户访问一个使用SSL/TLS协议的网站时,浏览器会查看该网站的证书是否由受信任的根证书颁发机构签名。如果该网站的证书是由受信任的根证书颁发机构签名,那么浏览器就会认为该网站是安全的,并允许用户与该网站进行加密通信。

根证书的安装意味着对这个CA认证中心的信任。从技术上讲,数字证书其实包含三部分,用户的信息、用户的公钥、还有CA中心对该证书里面的信息的签名。也就是说,用户在使用自己的数字证书之前必须先下载根证书。


继续上面的故事:

CA认证中心是第三方权威的认证机构,李四将自己的信息和公钥提交给CA机构,CA机构再三确认李四信息无误后会给李四提交的文件“盖个章”,表示这是经过权威就够认证无误的。


使用openssl模拟CA生成根证书

生成非对称加密的私钥,下面这个命令将生成私钥ca.pem,公钥可以有该私钥产生。

代码语言:javascript
复制
openssl genrsa -out ca.pem 2048
  1. openssl: 这是 OpenSSL 命令行工具的调用命令,用于执行各种与 SSL/TLS 和加密相关的操作。
  2. genrsa: 这是 OpenSSL 命令的一个子命令,用于生成 RSA 私钥。
  3. -out ca.pem: 这个参数指定生成的私钥应该保存到名为 “ca.pem” 的文件中。
  4. 2048: 这个参数指定生成的 RSA 私钥的大小,单位是比特。在这种情况下,它是 2048 位。2048 位是一个常用的密钥大小,因为它提供了良好的安全性,同时保持了相对快的性能。

或者

代码语言:javascript
复制
openssl genrsa -des3 -out ca.pem 2048

这个命令是使用 OpenSSL 来生成一个 RSA 私钥。让我们逐个解释命令中的参数:

  1. openssl: 这是 OpenSSL 命令行工具的调用命令,用于执行各种与 SSL/TLS 和加密相关的操作。
  2. genrsa: 这是 OpenSSL 命令的一个子命令,用于生成 RSA 私钥。
  3. -des3: 这个参数指示 OpenSSL 使用 3DES 加密算法来保护生成的私钥。当你存储或传输这个私钥时,它将被 3DES 加密。
  4. -out ca.pem: 这个参数指定生成的私钥应该保存到名为 “ca.pem” 的文件中。
  5. 2048: 这个参数指定生成的 RSA 私钥的大小,单位是比特。在这种情况下,它是 2048 位。2048 位是一个常用的密钥大小,因为它提供了良好的安全性,同时保持了相对快的性能。

总之,这个命令将生成一个使用 3DES 加密的 2048 位 RSA 私钥,并将其保存到 “ca.pem” 文件中。


生成csr文件 (证书签名请求)

该文件主要有两部分组成,一部分是描述该CA机构的信息,另一部分是CA的公钥。输入这条命令后需要输入CA机构的信息

代码语言:javascript
复制
openssl req -new  -key ca.pem -out ca.csr

用于生成一个新的证书签名请求(CSR)的命令,其中涉及到CA(证书颁发机构)的信息和公钥。

  • openssl req: 这是OpenSSL命令行工具的一个子命令,用于处理证书签名请求(CSR)和私钥。
  • -new: 这个选项表示要创建一个新的CSR。
  • -key ca.pem: 这个选项指定了私钥文件的路径,该私钥将与CSR相关联。在这个例子中,私钥文件是“ca.pem”。
  • -out ca.csr: 这个选项指定了输出文件的路径,生成的CSR将保存在这个文件中。在这个例子中,CSR文件将命名为“ca.csr”。

在执行这个命令后,通常会提示输入一些CA机构的信息,例如国家(C)、组织(O)、组织单位(OU)和通用名(CN)。这些信息将被包含在CSR中,并且将在生成证书时使用。


查看ca.csr文件
代码语言:javascript
复制
openssl req -in ca.csr -text -noout

这个命令做了以下几件事:

  1. openssl req: 这是 OpenSSL 的一个子命令,用于处理证书签名请求 (CSR)。
  2. -in ca.csr: 指定要处理的 CSR 文件名,这里是 ca.csr
  3. -text: 这个选项让 OpenSSL 显示 CSR 的详细信息,包括生成的随机数、证书的主题信息等。
  4. -noout: 这个选项告诉 OpenSSL 在显示 CSR 详细信息时不将其输出为DER格式。

执行这个命令后,会看到有关 ca.csr 的详细信息,包括其中的内容、主题、公钥等信息。

代码语言:javascript
复制
[root@VM-24-3-centos ssl]# openssl req -in ca.csr -text -noout
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=CN, ST=SD, L=JN, O=ZZ, OU=YY, CN=BB
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:b2:5c:13:a3:b1:4f:77:94:f6:a0:d6:f9:64:94:
                    75:9a:7e:f7:4f:6d:58:d1:a8:cf:57:07:75:69:e5:
                    49:8a:f8:b4:5e:c4:c4:e6:25:eb:b4:49:43:80:15:
                    8d:41:ae:2a:3a:da:98:de:cf:dc:c6:73:1d:cd:f2:
                    3f:00:cf:2f:d5:da:5c:7f:ed:41:f9:1b:bc:f7:67:
                    7b:af:49:26:05:c6:d4:e4:91:e3:0d:fd:2c:36:b5:
                    94:20:37:52:ba:ce:0f:c2:24:5f:bd:0b:d7:f5:ff:
                    7c:a0:9f:80:3f:bb:6d:f0:97:ca:af:f6:5f:3c:53:
                    b0:fc:e7:41:8b:88:db:49:05:f5:6a:22:d7:4e:a3:
                    f5:a9:b7:d0:f0:e2:81:23:14:29:21:44:1b:8d:d5:
                    a5:d1:75:53:91:0f:db:25:78:c8:e2:b0:6f:9b:35:
                    c5:43:4f:29:4c:cc:ab:ee:78:0c:12:b8:6a:d1:18:
                    93:37:03:c4:c9:11:55:73:5e:29:3c:9b:d4:e7:52:
                    25:ae:38:ef:00:bb:15:41:45:30:69:a9:52:cd:25:
                    84:29:ca:31:21:58:8c:72:28:cf:97:5a:d0:d1:64:
                    08:cd:09:68:da:4f:71:46:b7:94:58:34:40:93:a6:
                    53:8c:ee:64:22:c3:ca:51:19:f0:c0:8a:8e:0e:71:
                    97:63
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         39:0e:6a:d1:bb:ab:49:b0:77:75:f6:c0:d1:8c:78:a5:2d:b6:
         2a:97:41:6b:b6:b0:c2:5d:c0:7c:4c:53:1d:2f:0d:28:26:02:
         b4:e5:d2:6a:ef:f9:f1:65:6e:e6:c7:be:ba:89:6f:1a:0d:f6:
         b7:70:f4:1c:68:84:31:06:b2:90:8b:d8:c8:73:10:e8:8a:08:
         79:6d:55:bf:bd:2f:94:48:eb:2f:ef:65:f9:b7:e3:da:39:23:
         a5:cf:15:a3:06:75:e6:e1:b1:d7:4c:79:28:ef:c2:23:78:3b:
         83:5b:a5:a8:f5:02:f4:18:55:43:ee:3e:a4:ab:ed:2a:a7:2a:
         ec:0e:ba:05:10:c6:ed:10:49:24:78:61:36:5c:00:5e:86:7e:
         c8:81:13:46:79:9f:df:ee:84:ed:6a:b7:70:21:f6:32:b5:7b:
         53:5e:a9:68:10:29:1b:e8:aa:16:38:d7:a6:5e:64:b3:94:a3:
         95:e2:66:7a:44:45:6f:28:1f:2d:50:87:62:19:07:40:6d:19:
         be:94:03:1f:f3:04:d2:8f:0a:a7:a3:de:5a:a9:6f:cc:8b:4c:
         55:ea:da:cf:a6:84:0a:b4:97:84:33:d8:63:27:48:3d:fe:fc:
         c7:dd:cd:b0:7d:32:9d:db:44:d2:d9:53:f3:37:22:68:38:77:
         f7:89:fe:fa
[root@VM-24-3-centos ssl]#

生成数字证书ca.crt

该证书主要是对ca.csr的摘要信息用ca.pem私钥加密,并把加密的摘要附在后面

代码语言:javascript
复制
openssl x509 -req -in ca.csr -out ca.crt -signkey ca.pem-days 3650

这个命令是用来将一个证书签名请求(CSR)转换为一个自签名证书(CRT)的。

具体来说,这个命令做了以下几件事:

  1. openssl x509: 这是 OpenSSL 的一个子命令,用于处理 X.509 证书。
  2. -req: 这个选项表示输入是一个证书签名请求(CSR)。
  3. -in ca.csr: 指定输入的 CSR 文件名为 ca.csr
  4. -out ca.crt: 指定输出的证书文件名为 ca.crt
  5. -signkey ca.pem: 这个选项告诉 OpenSSL 使用 ca.pem 文件中的私钥来签名 CSR。
  6. -days 3650: 这个选项设置证书的有效期为 3650 天,即大约 10 年。

执行这个命令后,将会生成一个名为 ca.crt 的自签名证书,该证书由 ca.pem 中的私钥签名,并具有 10 年的有效期。


查看ca.crt文件信息

可以使用以下命令来查看 ca.crt 文件的信息:

代码语言:javascript
复制
openssl x509 -in ca.crt -text -noout

这个命令做了以下几件事:

  1. openssl x509: 这是 OpenSSL 的一个子命令,用于处理 X.509 证书。
  2. -in ca.crt: 指定要查看的证书文件名为 ca.crt
  3. -text: 这个选项让 OpenSSL 显示证书的详细信息,包括证书的主题、有效期、签名算法、发行者、所有者等信息。
  4. -noout: 这个选项告诉 OpenSSL 在显示证书详细信息时不将其输出为DER格式。

执行这个命令后,会看到有关 ca.crt 的详细信息,包括其中的内容、主题、有效期、签名算法等。

代码语言:javascript
复制
[root@VM-24-3-centos ssl]# openssl x509 -in ca.crt -text -noout
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            c9:84:dc:7c:91:7a:73:48
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=XX, L=Default City, O=Default Company Ltd
        Validity
            Not Before: Jan 24 09:41:31 2024 GMT
            Not After : Jan 21 09:41:31 2034 GMT
        Subject: C=XX, L=Default City, O=Default Company Ltd
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:b2:5c:13:a3:b1:4f:77:94:f6:a0:d6:f9:64:94:
                    75:9a:7e:f7:4f:6d:58:d1:a8:cf:57:07:75:69:e5:
                    49:8a:f8:b4:5e:c4:c4:e6:25:eb:b4:49:43:80:15:
                    8d:41:ae:2a:3a:da:98:de:cf:dc:c6:73:1d:cd:f2:
                    3f:00:cf:2f:d5:da:5c:7f:ed:41:f9:1b:bc:f7:67:
                    7b:af:49:26:05:c6:d4:e4:91:e3:0d:fd:2c:36:b5:
                    94:20:37:52:ba:ce:0f:c2:24:5f:bd:0b:d7:f5:ff:
                    7c:a0:9f:80:3f:bb:6d:f0:97:ca:af:f6:5f:3c:53:
                    b0:fc:e7:41:8b:88:db:49:05:f5:6a:22:d7:4e:a3:
                    f5:a9:b7:d0:f0:e2:81:23:14:29:21:44:1b:8d:d5:
                    a5:d1:75:53:91:0f:db:25:78:c8:e2:b0:6f:9b:35:
                    c5:43:4f:29:4c:cc:ab:ee:78:0c:12:b8:6a:d1:18:
                    93:37:03:c4:c9:11:55:73:5e:29:3c:9b:d4:e7:52:
                    25:ae:38:ef:00:bb:15:41:45:30:69:a9:52:cd:25:
                    84:29:ca:31:21:58:8c:72:28:cf:97:5a:d0:d1:64:
                    08:cd:09:68:da:4f:71:46:b7:94:58:34:40:93:a6:
                    53:8c:ee:64:22:c3:ca:51:19:f0:c0:8a:8e:0e:71:
                    97:63
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha256WithRSAEncryption
         3e:36:2d:ef:dd:97:de:ff:ad:99:0d:09:46:c3:54:9a:66:0e:
         2c:b8:e9:6c:05:6b:40:59:37:e6:05:9e:af:38:7c:3e:58:ec:
         69:18:2f:66:13:e7:81:fc:7c:ef:8c:5c:7d:25:00:71:b2:ae:
         4b:7d:a7:ad:04:d9:96:2d:4b:c7:bc:26:96:4c:ba:3a:72:ca:
         4b:6e:61:8b:d8:74:eb:59:34:f9:68:0e:f3:bb:55:9f:48:f3:
         34:89:bc:79:70:d4:dc:46:43:17:55:c8:a8:2b:5f:f7:06:5c:
         be:53:06:83:6d:40:a3:29:4d:16:84:d4:86:f1:f1:5b:23:1a:
         fc:d8:fa:7f:93:fb:27:b6:10:16:5f:ab:17:5c:dd:f1:27:3a:
         a9:9d:ec:be:ba:32:2f:b5:7f:f2:22:de:8c:de:88:ab:1a:4b:
         0d:d7:5f:98:46:26:f1:44:bd:fa:9c:b3:64:f2:db:c2:53:ee:
         69:1d:aa:e2:64:1b:18:74:8b:2e:0f:10:ba:67:0d:aa:c6:f8:
         6a:0e:ab:f5:b1:21:ad:84:39:65:50:86:49:c7:61:77:12:3f:
         f5:48:07:87:83:38:9a:5b:f6:bd:29:07:66:27:f2:e5:2a:72:
         d1:01:0e:c9:43:08:da:1c:f0:c4:ae:c1:e0:99:c9:6f:6a:d9:
         48:f3:79:fa
[root@VM-24-3-centos ssl]#

小结
  • ca.pem:rsa非对称加密私钥,用该私钥能推导出公钥
  • ca.csr:根证书申请文件,该文件有申请者的信息和公钥
  • ca.crt:根证书,主要内容是ca.csr+数字签名 , ca.crt是公开的,使用者可以下载,主要是用里面ca的公钥。

在非对称加密中,私钥用于解密和签名数据,而公钥用于加密和验证签名。

  1. ca.pem: 这确实是 RSA 非对称加密的私钥。私钥用于解密数据、验证消息的完整性和身份。它必须保持私密,不能泄露给任何未经授权的实体。
  2. ca.csr: 这是一个证书签名请求(CSR)文件,通常包含申请证书的实体(如网站或服务器)的信息,以及该实体的公钥。CSR 文件用于向证书颁发机构(CA)提交申请,请求为其生成一个证书。
  3. ca.crt: 这是由 CA 生成的证书文件,通常包含 CSR 中的信息(如主题、有效期等)以及 CA 的签名。这个签名验证了证书的所有者和证书内容的有效性。一旦证书被签名并分发,任何人都可以使用 CA 的公钥来验证这个签名,从而验证证书的有效性和真实性。由于证书是公开的,使用者可以下载并使用其中的 CA 公钥进行通信和验证其他证书。

在实际应用中,CA(证书颁发机构)使用其私钥对来自各种实体(如网站、服务器等)的 CSR 进行签名,生成证书。然后,这些证书可以被安装在客户端或服务器上,以建立安全的通信通道。通过使用公钥和私钥对数据进行加密和解密,可以确保数据在传输过程中的安全性和完整性。

申请ca证书

申请CA证书的步骤如下:

  1. 选择一家可信的数字证书颁发机构,如 VeriSign、GlobalSign、Comodo 或 Symantec 等。
  2. 根据需求,确定要申请的证书类型,如 SSL 证书、代码签名证书、身份验证证书、电子邮件证书或文档签名证书等。
  3. 准备必要的申请材料,包括企业或个人证书申请者的信息、身份证明、证书类型和域名等。
  4. 填写 CA 证书申请表,并提交给所选择的数字证书颁发机构。
  5. 支付 CA 证书的费用。
  6. 等待 CA 证书颁发机构的审核,审核通过后即可下载和安装 CA 证书。

请注意,在申请 CA 证书时,务必确保提供准确的个人信息和支付信息,并在公共网络上进行 CA 证书申请以确保个人信息和支付信息的安全。在收到 CA 证书下载链接后,应尽快下载并安装,以确保网络安全。


继续上个故事:

李四想要CA机构申请自己的证书该怎么办呢?下面用openssl模拟ca机构来为李四签发数字证书

1、李四先生成自己的非对称加密密钥LiSi.pem
代码语言:javascript
复制
openssl genrsa -out LiSi.pem 2048
2、李四生成LiSi.csr文件,需要填写上李四的信息
代码语言:javascript
复制
openssl req -new  -key LiSi.pem -out LiSi.csr
3、李四将该csr提交给ca中心,ca中心根据李四提交的csr进行签名,最后ca生成给李四的数字证书是LiSi.crt文件
代码语言:javascript
复制
openssl x509 -req -in LiSi.csr -out LiSi.crt -CA  ./ca.crt -CAkey  ./ca.pem -CAcreateserial -days 3650

上述过程描述了一个基本的流程,用于生成一个自签名证书,通常用于HTTPS服务器或客户端的身份验证。

以下是详细的步骤解释:

  1. 生成私钥
代码语言:javascript
复制
openssl genrsa -out LiSi.pem 2048

使用openssl genrsa命令生成一个私钥。-out LiSi.pem指定生成的私钥文件名为LiSi.pem2048指定生成的密钥长度为2048位,这是一个常见的选择,但也可以选择其他长度。

  1. 生成证书签名请求(CSR)
代码语言:javascript
复制
openssl req -new  -key LiSi.pem -out LiSi.csr

使用openssl req命令创建一个新的证书签名请求(CSR)。-new表示创建一个新的请求。-key LiSi.pem指定使用之前生成的私钥文件。-out LiSi.csr指定输出的CSR文件名为LiSi.csr

  1. 自签名证书 为了从CSR生成自签名证书,实际上不需要CA中心,因为我们自己就是CA。但
代码语言:javascript
复制
openssl x509 -req -in LiSi.csr -out LiSi.crt -CA ../ca.crt -CAkey ../ca.pem -CAcreateserial -days 3650

使用openssl x509命令从CSR创建一个自签名证书。

  • -req: 指定输入的CSR文件。
  • -in LiSi.csr: 指定输入的CSR文件名为LiSi.csr
  • -out LiSi.crt: 指定输出的证书文件名为LiSi.crt
  • -CA ../ca.crt: 指定CA的证书文件路径,用于验证您是否有权限签名此证书。这里使用的是相对路径指向上一级目录中的ca.crt文件。
  • -CAkey ../ca.pem: 指定CA的私钥文件路径,用于创建序列号并签署证书。这里使用的是相对路径指向上一级目录中的ca.pem文件。
  • -CAcreateserial: 创建一个新的序列号文件。这通常与CA一起使用,但在这里不必要,因为我们只是自签名。
  • -days 3650: 设置证书的有效期为3650天。根据您的需要,可以更改此值。

完成上述步骤后,我们应该有一个私钥文件(LiSi.pem)、一个证书签名请求(LiSi.csr)和一个自签名证书(LiSi.crt)。

4、 用openssl x509 -in LiSi.crt -text -noout看一下李四的数字证书

可以看出,李四的数字证书中包含:版本+证书序号+ca机构信息+证书有效期+李四个人信息+李四公钥+ca对李四csr的数字签名


5. 李四得到证书后可以验证一下证书的有效性
代码语言:javascript
复制
openssl verify -CAfile ./ca.crt  LiSi.crt

这条命令是用于验证一个证书是否由指定的CA(证书颁发机构)签署。

具体来说,openssl verify -CAfile ../ca.crt LiSi.crt 的作用是:

  1. openssl verify: 这是 OpenSSL 的一个子命令,用于验证证书的有效性。
  2. -CAfile ../ca.crt: 这个选项指定了 CA 的证书文件路径。在这里,它是相对路径指向上一级目录中的 ca.crt 文件。CA 的证书通常包含公钥,用于验证其他证书的签名。
  3. LiSi.crt: 这是要验证的证书文件名。

执行这个命令后,如果 LiSi.crt 是由 ../ca.crt 文件中指定的CA签署的,命令将输出 “OK”,否则将输出证书验证失败的原因。


完整流程

继续上个故事:

李四给张三写加密信的完整流程

1、李四和张三都从ca机构下载根证书

2、李四和张三都向ca机构申请数字证书

3、互换数字证书并用根证书验证

4、李四用张三的证书中的公钥对信加密

5、李四用私钥对信进行签名

6、李四将加密的信和签名都发给张三

7、张三收到信后先用私钥解开加密的信,在用李四证书中的公钥验证签名

8、签名验证成功,张三可以看信了


总结

数字签名和数字证书是信息安全领域的两个重要概念,它们都涉及到信息的完整性和发送者的身份验证。以下是它们各自的定义和所使用的技术:

  1. 数字签名:

定义:数字签名是一种用于验证信息完整性和发送者身份的方法。它使用信息摘要和非对称加密技术,确保信息的完整性和不可篡改性,同时验证发送者的身份。

技术:数字签名使用两个密钥:公钥和私钥。私钥用于生成数字签名,而公钥用于验证签名。发送者使用私钥对信息进行加密,生成数字签名,并将签名与原始信息一起发送给接收者。接收者使用公钥对签名进行解密,验证信息的完整性和发送者的身份。

  1. 数字证书:

定义:数字证书是由第三方权威机构出具的一种证明信息可靠性的方法。它使用数字签名技术,确保证书本身和所验证的信息的完整性和可信度。

技术:数字证书包含证书持有人的公钥和身份信息,以及发行机构的数字签名。发行机构使用自己的私钥对证书进行签名,确保证书的完整性和可信度。数字证书可以用于验证网站的身份、电子邮件地址或任何其他需要证明可靠性的信息。

总之,数字签名和数字证书都是利用信息摘要和非对称加密技术来确保信息的完整性和可信度的方法。数字签名主要用于验证发送者的身份和信息的完整性,而数字证书则由权威机构出具,用于证明信息的可靠性。

使用OpenSSL生成证书并配置Https