密钥和证书,纯理论介绍篇

先介绍密钥的PKCS (Public Key Cryptography Standards)

是由 RSA 实验室与其它安全系统开发商为促进公钥密码的发展而制订的一系列标准,用于增强公钥密码系统的互操作性。

先写上总结:
用于加密算法实现的标准:PKCS#1、PKCS#5、PKCS#9 等,主要定义了加密、解密、签名、验签等算法及其实现方式。
用于密钥传输和存储的标准:PKCS#7、PKCS#8、PKCS#10、PKCS#12、PKCS#15 等,主要用于定义加密消息的结构、私钥和证书的存储格式,以及安全数据的传输和交换方式。

用于密钥协商和传输标准:PKCS#3

以下是PKCS发布过的一些标准:

(1)PKCS#1:RSA加密标准。PKCS#1定义了RSA公钥函数的基本格式标准,特别是数字签名。它定义了数字签名如何计算,包括待签名数据和签名本身的格式;它也定义              了PSA公/私钥的语法。

      应用:加密数据、数字签名、密钥交换等。

(2)PKCS#2:涉及了RSA的消息摘要加密,这已被并入PKCS#1中。

(3)PKCS#3:Diffie-Hellman密钥协议标准。PKCS#3描述了一种实现Diffie- Hellman密钥协议的方法。PKCS#3 主要涉及密钥的协商(即传输)过程,而不是具体的加密算法实现或密钥的存储的标准。它定义了 Diffie-Hellman 密钥交换的具体方法,确保通信双方能够安全地生成共享密钥,以用于后续的加密通信。
(4)PKCS#4:最初是规定RSA密钥语法的,现已经被包含进PKCS#1中。
(5)PKCS#5:基于口令的加密标准。PKCS#5描述了使用由口令生成的密钥来加密8位位组串并产生一个加密的8位位组串的方法。

      应用:PKCS#5可以用于加密私钥,以便于密钥的安全传输(这在PKCS#8中描述);通过用户口令生成加密密钥,用于加密文件、数据等。
(6)PKCS#6:扩展证书语法标准。PKCS#6定义了提供附加实体信息的X.509证书属性扩展的语法(当PKCS#6第一次发布时,X.509还不支持扩展。这些扩展因此被包括在X.509中)。
(7)PKCS#7:密码消息语法标准。PKCS#7为使用密码算法的数据规定了通用语法,比如数字签名和数字信封。PKCS#7提供了许多格式选项,包括未加密或签名的格式化消息、已封装(加密)消息、已签名消息和既经过签名又经过加密的消息。

    用途:定义了加密消息和数字签名的结构,用于在数据传输过程中进行加密和签名。
    应用:电子邮件加密(S/MIME)、安全文件传输等。

(8)PKCS#8:私钥信息语法标准。PKCS#8定义了私钥信息语法和加密私钥语法,其中私钥加密使用了PKCS#5标准。

    用途:标准化私钥的存储格式,支持加密和未加密的私钥存储。
    应用:私钥的安全存储和导入导出。

(9)PKCS#9:可选属性类型。PKCS#9定义了PKCS#6扩展证书、PKCS#7数字签名消息、PKCS#8私钥信息和PKCS#10证书签名请求中要用到的可选属性类型。已定义的证书属性包括E-mail地址、无格式姓名、内容类型、消息摘要、签名时间、签名副本(counter signature)、质询口令字和扩展证书属性。

(10)PKCS#10:证书请求语法标准。PKCS#10定义了证书请求的语法。证书请求包含了一个唯一识别名、公钥和可选的一组属性,它们一起被请求证书的实体签名(证书管理协议中的PKIX证书请求消息就是一个PKCS#10)。

     用途:定义了证书申请请求的结构,用于请求证书颁发机构(CA)生成证书。
     应用:生成 CSR 请求以申请数字证书。

(11)PKCS#11:密码令牌接口标准。PKCS#11或“Cryptoki”为拥有密码信息(如加密密钥和证书)和执行密码学函数的单用户设备定义了一个应用程序接口(API)。智能卡就是实现Cryptoki的典型设备。注意:Cryptoki定义了密码函数接口,但并未指明设备具体如何实现这些函数。而且Cryptoki只说明了密码接口,并未定义对设备来说可能有用的其他接口,如访问设备的文件系统接口。

(12)PKCS#12:个人信息交换语法标准。PKCS#12定义了个人身份信息(包括私钥、证书、各种秘密和扩展字段)的格式。PKCS#12有助于传输证书及对应的私钥,于是用户可以在不同设备间移动他们的个人身份信息。

     用途:用于打包和加密存储私钥、公钥证书及链式证书,便于安全传输和跨平台导入。
     应用:生成 .pfx 或 .p12 文件,用于客户端认证、证书导入等。

(13)PKCS#13:椭圆曲线密码标准。PKCS#13标准当前正在完善之中。它包括椭圆曲线参数的生成和验证、密钥生成和验证、数字签名和公钥加密,还有密钥协定,以及参数、密钥和方案标识的ASN.1语法。

(14)PKCS#14:伪随机数产生标准。PKCS#14标准当前正在完善之中。为什么随机数生成也需要建立自己的标准呢?PKI中用到的许多基本的密码学函数,如密钥生成和Diffie-Hellman共享密钥协商,都需要使用随机数。然而,如果“随机数”不是随机的,而是取自一个可预测的取值集合,那么密码学函数就不再是绝对安全了,因为它的取值被限于一个缩小了的值域中。因此,安全伪随机数的生成对于PKI的安全极为关键。

(15)PKCS#15:密码令牌信息语法标准。PKCS#15通过定义令牌上存储的密码对象的通用格式来增进密码令牌的互操作性。在实现PKCS#15的设备上存储的数据对于使用该设备的所有应用程序来说都是一样的,尽管实际上在内部实现时可能所用的格式不同。PKCS#15的实现扮演了翻译家的角色,它在卡的内部格式与应用程序支持的数据格式间进行转换。

    用途:定义了如何在智能卡上安全存储加密信息,如密钥和证书。
    应用:智能卡的密钥和证书管理。

X509

X.509是常见通用的证书格式。所有的证书都符合为Public Key Infrastructure (PKI) 制定的 ITU-T X509 国际标准。X.509是国际电信联盟-电信(ITU-T)部分标准和国际标准化组织(ISO)的证书格式标准。作为ITU-ISO目录服务系列标准的一部分,X.509是定义了公钥证书结构的基本标准。1988年首次发布,1993年和1996年两次修订。当前使用的版本是X.509 V3,它加入了扩展字段支持,这极大地增进了证书的灵活性。X.509 V3证书包括一组按预定义顺序排列的强制字段,还有可选扩展字段,即使在强制字段中,X.509证书也允许很大的灵活性,因为它为大多数字段提供了多种编码方案.

 

密钥的文件格式编码格式说明

编码格式:二进制 或 ASCII(即base64编码)

文件格式:

  • PEM:(Privacy Enhanced Mail)以 Base64 编码的文本文件,通常包含  

                                                                            -----BEGIN CERTIFICATE-----
                                                                                 (Base64 编码的证书数据)
                                                                                        -----END CERTIFICATE-----

                                                                                     -----BEGIN PRIVATE KEY-----
                                                                                     (Base64 编码的私钥数据)
                                                                                       -----END PRIVATE KEY-----    这样的标记。

  • DER:(Distinguished Encoding Rules)二进制编码的文件,通常更紧凑,但不如 PEM 格式直观。
  • PKCS#8:用于存储私钥,支持加密的私钥存储。
  • PKCS#10: 证书请求标准(.p10),.p10是证书请求文件,与.csr文件类似
  • PKCS#12:用于存储证书链和对应的私钥,通常包含加密保护。

文件扩展名,用于指示文件的类型或使用目的,有助于操作系统或应用程序识别文件类型,但它并不能决定文件的内容或格式。

  • .key:常用于存储私钥,内容可以是 PEM 格式或 DER 格式。
  • .pem:通常是 PEM 编码的文件,可以存储公钥、私钥或证书。
  • .crt / .cer:常用于存储 X.509 证书,内容可以是 PEM 或 DER 格式。
  • .p12 / .pfx:使用 PKCS#12 容器格式,通常包含公钥、私钥和证书。
  • .der:二进制编码的证书或密钥文件。

1. Linux 平台
主要使用的证书格式:PEM
PEM(Privacy Enhanced Mail)格式:这是 Linux 平台上最常用的证书格式,广泛应用于 Apache、Nginx 等 Web 服务器,以及 OpenSSL 等工具。

文件扩展名:通常为 .pem、.crt、.cer、.key。
内容:可以包含证书、公钥、私钥、证书链等内容

常用场景:Web 服务器:如 Apache 和 Nginx 使用 .crt 和 .key 文件来加载证书和私钥。

     OpenSSL 工具:PEM 格式的证书常用于 OpenSSL 进行各种加密操作。
例子:Apache/Nginx 的 SSL 配置通常会指向 PEM 格式的证书和私钥文件

文件类型和用途:
.crt / .cer:存储单个证书,可以是 PEM 或 DER 编码,Linux 上通常使用 PEM 编码。
.key:存储私钥,通常是 PEM 编码。
.pem:可以包含证书、私钥、证书链等,通常用于综合存储。

 

2. Windows 平台
主要使用的证书格式:PFX(PKCS#12)
PFX(Personal Information Exchange)格式:在 Windows 平台上,PFX(或 .p12)格式最常用。它可以包含证书、公钥、私钥和证书链,并且通常是加密保护的。

编码形式:二进制编码。
文件扩展名:.pfx 或 .p12。
内容:PFX 文件可以包含完整的证书链、公钥和私钥,通常需要密码来导入或导出。

文件类型和用途:
.pfx / .p12:存储证书、私钥和证书链,适合 Windows 系统的完整证书包。
.cer / .crt:通常是 DER 编码的证书文件,适用于 Windows 系统中单独的证书导入。
.der:纯二进制格式的证书文件,适合 Windows 系统。

 

各种名词、文件的解释说明:

P10文件,是指PKCS#10 证书签名请求(Certificate Signing Request,CSR)文件。
    它是一个包含公钥以及相关信息的请求文件,通常用于申请数字证书。
P10 文件包含以下内容:
  • 公钥:申请者的公钥,未来的证书将基于此公钥生成。
  • 可选的相关信息:如申请者的身份信息,包括组织名称、域名、电子邮件等。
  • 数字签名:由申请者的私钥生成的数字签名,用于验证 CSR 的完整性和真实性。

 

 CSR文件,Certificate Signing Request(证书签名请求)文件。用途:用于向证书颁发机构(CA)申请数字证书。

      CSR 文件包含申请者的公钥和申请者的身份信息,并使用私钥对这些信息进行签名。
  内容:

  • 公钥:申请者的公钥。
  • 申请者信息:组织名称、部门、国家、州/省、市等。
  • 签名:由申请者的私钥生成,用于证明请求的合法性。
CSR文件和 P10文件本质上是相同的,P10文件是 CSR文件的标准化格式。它们都用于申请数字证书并包含申请者的公钥和身份信息;
P10文件是 CSR文件的具体实现格式。
换句话说,CSR文件和P10文件是同一种文件的不同称谓,P10指的是文件遵循 PKCS#10标准的格式,而CSR是其常用的名称。
CSR文件和 P10文件通常都是以 .csr 或 .p10 作为文件扩展名,但它们实际上是相同类型的文件。

 

.key 文件:是一个通用的密钥文件格式,可以用于多种加密算法,广泛应用于全球范围内的各种加密场景。
.sm2 文件:专门用于存储 SM2 算法的密钥,主要在中国国家标准相关的领域和场景中使用。
两者的主要区别在于所使用的加密算法和应用场景。

 

SM3withSM2 的工作原理
当你使用 SM3withSM2 进行数字签名时,流程如下:
1、哈希计算(SM3):首先,对需要签名的消息(数据)使用 SM3 哈希算法生成一个固定长度(256位)的哈希值。
2、数字签名(SM2):然后,使用 SM2 私钥对这个哈希值进行签名,生成数字签名。
3、验证签名:接收方使用 SM2 公钥验证数字签名是否有效,验证通过则说明消息未被篡改。

 

数字证书和密钥的区别:
1. 数字证书的组成
一个数字证书包含以下主要部分:
公钥:这是证书的核心部分,用于加密数据或验证签名。证书持有者的公钥通常存储在证书中。
证书主体信息:包括证书持有者的身份信息,如组织名称、个人姓名、电子邮件地址、所在国家等。这些信息用于识别证书的持有者。
颁发机构信息:颁发证书的认证机构(CA, Certificate Authority)的名称和信息。这表明谁对证书内容的真实性负责。
有效期:证书的生效日期和失效日期,指明证书的有效时间范围。
证书序列号:由 CA 分配的一个唯一编号,用于识别和管理证书。
签名算法:用于签署证书的加密算法信息,通常包括签名算法本身和与之相关的参数。
CA 的数字签名:由颁发机构的私钥生成的签名,用于验证证书的真实性和完整性。这个签名确保证书内容未被篡改,且确实是由 CA 颁发的。

2. 数字证书 vs 公钥
公钥:公钥是非对称加密算法中的一部分,用于加密数据或验证数字签名。它本身并没有与特定身份信息直接关联。
数字证书:数字证书将公钥与证书持有者的身份信息绑定在一起,并通过 CA 的签名来验证其真实性。
换句话说,数字证书不仅提供了公钥,还通过第三方机构(CA)的信任链证明了公钥的所有者是谁。 3. 证书的作用 身份验证:数字证书通过绑定公钥和身份信息来验证持有者的身份。浏览器通过验证服务器提供的证书来确认服务器的身份,从而建立安全的 SSL/TLS 连接。 数据加密:在 SSL/TLS 协议中,证书中的公钥用于加密会话密钥,从而确保数据在传输过程中保持机密性。 数字签名:证书持有者可以使用其对应的私钥对数据进行签名,接收方可以使用证书中的公钥来验证签名,确保数据的完整性和来源的真实性。 4. 总结 数字证书确实包含公钥,但它不仅仅是公钥。它是一个更为复杂的结构,包含公钥以及与公钥相关的身份信息,并由 CA 的签名来保证其真实性。
数字证书在各种加密通信和身份验证系统中起着至关重要的作用,是现代网络安全的重要基础之一。

 

posted @ 2024-09-05 01:53  tomato_4  阅读(140)  评论(0编辑  收藏  举报