根证书、中间证书、目标证书,以及签名和验签(基于openssl)

根证书、中间证书、目标证书,以及签名和验签(基于openssl)

1 相关名词解释

在讨论证书和加密的上下文中,以下是一些基本概念的解释:

CA (Certificate Authority):证书颁发机构,是一个负责颁发和管理数字证书的实体。CA 验证实体(如个人、公司或服务器)的身份,并发行数字证书,这些证书包含公钥和身份信息,并由 CA 的私钥签名。

Root CA (Root Certificate Authority):根证书颁发机构是证书层级结构中的最顶层。它是一个自签名的证书,用于信任链的起点。Root CA 的公钥被广泛分发,并被操作系统和浏览器预装,作为信任的根基。

Intermediate CA (Intermediate Certificate Authority):中间证书颁发机构位于根 CA 下一层,用于签署下级 CA 或终端实体的证书。使用中间 CA 可以减轻根 CA 的负担,并允许更灵活的证书管理。

Target CA (Target Certificate Authority):目标证书颁发机构通常是证书层级结构中的最低层,用于为终端实体(如网站、电子邮件用户等)颁发证书。

CSR (Certificate Signing Request):证书签名请求是一个包含公钥和身份信息的消息,由证书申请者生成并发送给 CA。CA 验证 CSR 的内容后,会用其私钥对公钥和身份信息进行签名,生成数字证书。

Sign:签名是使用私钥对数据进行加密的过程,以验证数据的完整性和来源。数字签名通常用于确保数据未被篡改,并证明数据确实来自声称的发送者。

Verify:验证是检查数字签名是否有效的过程,通常使用签名者的公钥。如果签名验证成功,说明数据在传输过程中未被篡改,且确实来自签名者。

Pubkey (Public Key):公钥是加密密钥对中的一个,可以公开分享。在非对称加密中,公钥用于加密数据或验证签名。

PEM (Privacy Enhanced Mail):PEM 是一种文件格式,用于存储和发送加密密钥、证书和其他加密材料。PEM 文件通常以 Base64 编码,包含头尾标记,如 `-----BEGIN CERTIFICATE-----`。

DER (Distinguished Encoding Rules)*:DER 是一种二进制编码格式,用于 ASN.1 数据结构。它是一种紧凑的格式,常用于证书和私钥的存储。

RSA:RSA 是一种广泛使用的非对称加密算法,基于大整数分解的困难性。它用于加密、解密、签名和验证签名。

SHA-256 (Secure Hash Algorithm 256):SHA-256 是一种加密哈希函数,属于 SHA-2 算法家族。它生成一个 256 位的哈希值,用于确保数据的完整性。

SRL (Certificate Serial Number File):序列号文件是由 CA 维护的一个文件,记录了颁发证书的序列号。每次颁发新证书时,都会更新这个文件,以确保每个证书都有一个唯一的序列号。

这些概念构成了公钥基础设施(PKI)的基础,用于在互联网上安全地交换信息和验证身份。

1.1 为什么要生成中间证书?

生成中间证书(Intermediate Certificate)在公钥基础设施(PKI)中有几个重要的原因和好处:

分层管理:通过引入中间证书,可以创建一个分层的证书结构,使得根证书(Root Certificate)不需要直接签发大量的终端实体证书。这种分层管理可以提高证书管理的效率和灵活性。

减少根密钥的暴露风险:如果根密钥被泄露,那么所有由该根证书签发的证书都将受到威胁。通过使用中间证书,可以减少根密钥的暴露风险,因为即使中间密钥被泄露,影响的范围也仅限于由该中间证书签发的证书。

密钥轮换:中间证书的密钥可以定期更换,而不需要更换根密钥。这样可以保持根证书的长期稳定性,同时确保整个系统的安全性。

策略和控制:不同的中间证书可以实施不同的策略和控制措施。例如,一个中间证书可以专门用于签发服务器证书,另一个可以用于客户端证书,这样可以根据不同的业务需求和安全要求进行更细致的管理。

跨地域管理:在大型组织或跨国公司中,中间证书可以分配给不同的地理位置或业务部门,使得每个部门可以管理自己的证书,而不需要每次都通过中央团队来处理。

撤销管理:证书撤销列表(CRL)或在线证书状态协议(OCSP)响应可以由中间证书维护,这样可以减少根CA的负载,并且可以更频繁地更新撤销信息。

性能优化:在验证证书路径时,中间证书可以减少需要处理的证书数量,从而提高验证过程的效率。

法律和合规性:在某些情况下,中间证书可以用来满足特定的法律或合规性要求,例如在不同的法律管辖区签发证书。

总之,中间证书是PKI中的一个重要组件,它提供了一种有效的方式来增强安全性、灵活性和可管理性。

2 基于OpenSSL生成根证书、中间证书、目标证书,并进行签名和验签

2.1 生成证书和签名验签命令和流程图

生成根证书、中间证书、目标证书,然后签名和验签流程如下:

# 生成根证书

openssl genrsa -out rootCA.key 2048

openssl req -new -key rootCA.key -out rootCA.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Example Company/OU=IT Department/CN=rootCA.example.com"

openssl x509 -req -days 3650 -in rootCA.csr -signkey rootCA.key -out rootCA.cer -extensions v3_ca -extfile <( cat <<-EOF

[ v3_ca ]

subjectKeyIdentifier = hash

authorityKeyIdentifier = keyid:always,issuer

basicConstraints = critical,CA:true

keyUsage = critical, digitalSignature, keyCertSign

EOF

)

# 生成中间证书

openssl genrsa -out intermediateCA.key 2048

openssl req -new -key intermediateCA.key -out intermediateCA.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Example Company/OU=Intermediate CA/CN=intermediateCA.example.com"

openssl x509 -req -days 3650 -in intermediateCA.csr -CA rootCA.cer -CAkey rootCA.key -CAcreateserial -out intermediateCA.cer -extensions v3_ca -extfile <( cat <<-EOF

[ v3_ca ]

subjectKeyIdentifier = hash

authorityKeyIdentifier = keyid:always,issuer

basicConstraints = critical,CA:true

keyUsage = critical, digitalSignature, keyCertSign

EOF

)

# 生成目标证书

openssl genrsa -out targetCA.key 2048

openssl req -new -key targetCA.key -out targetCA.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Example Company/OU=Target CA/CN=targetCA.example.com"

openssl x509 -req -days 3650 -in targetCA.csr -CA intermediateCA.cer -CAkey intermediateCA.key -CAcreateserial -out targetCA.cer -extensions v3_ca -extfile <( cat <<-EOF

[ v3_ca ]

subjectKeyIdentifier = hash

authorityKeyIdentifier = keyid:always,issuer

basicConstraints = critical,CA:true

keyUsage = critical, digitalSignature, keyCertSign

EOF

)

# 校验中间证书

openssl verify -CAfile rootCA.cer intermediateCA.cer

# 校验目标证书

openssl verify -CAfile rootCA.cer -untrusted intermediateCA.cer targetCA.cer

#签名、提取公钥、验签

openssl dgst -sha256 -sign targetCA.key -out signature.sig data

openssl x509 -pubkey -noout -in targetCA.cer > targetCA_pub.key

openssl dgst -sha256 -verify targetCA_pub.key -signature signature.sig data

流程如大致如下:

2.2 命令流程的详细解释

A 生成根证书 (Root CA)

A.1 Root CA生成私钥

openssl genrsa -out rootCA.key 2048

这条命令生成一个2048位的私钥,并将其保存到 `rootCA.key` 文件中。

A.2 创建证书签名请求 (CSR)

openssl req -new -key rootCA.key -out rootCA.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Example Company/OU=IT Department/CN=rootCA.example.com"

使用私钥创建一个证书签名请求(CSR),并指定证书的主题信息。

A.3 自签名根证书

openssl x509 -req -days 3650 -in rootCA.csr -signkey rootCA.key -out rootCA.cer -extensions v3_ca -extfile <( cat <<-EOF

[ v3_ca ]

subjectKeyIdentifier = hash

authorityKeyIdentifier = keyid:always,issuer

basicConstraints = critical,CA:true

keyUsage = critical, digitalSignature, keyCertSign

EOF

)

使用私钥对CSR进行签名,生成一个有效期为10年(3650天)的自签名根证书,并设置必要的扩展。

B 生成中间证书 (Intermediate CA)

B.1 生成私钥

openssl genrsa -out intermediateCA.key 2048

B.2 创建CSR

openssl req -new -key intermediateCA.key -out intermediateCA.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Example Company/OU=Intermediate CA/CN=intermediateCA.example.com"

B.3 将csr文件传到Root CA,使用Root CA私钥签名中间证书

openssl x509 -req -days 3650 -in intermediateCA.csr -CA rootCA.cer -CAkey rootCA.key -CAcreateserial -out intermediateCA.cer -extensions v3_ca -extfile <( cat <<-EOF

[ v3_ca ]

subjectKeyIdentifier = hash

authorityKeyIdentifier = keyid:always,issuer

basicConstraints = critical,CA:true

keyUsage = critical, digitalSignature, keyCertSign

EOF

)

使用根证书的私钥对中间CA的CSR进行签名,生成中间证书。

C 生成目标证书 (Target CA)

C.1 生成私钥

openssl genrsa -out targetCA.key 2048

C.2 创建CSR

openssl req -new -key targetCA.key -out targetCA.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Example Company/OU=Target CA/CN=targetCA.example.com"

C.3 将csr文件传到Intermediate CA,使用Intermediate CA的私钥签名目标证书

openssl x509 -req -days 3650 -in targetCA.csr -CA intermediateCA.cer -CAkey intermediateCA.key -CAcreateserial -out targetCA.cer -extensions v3_ca -extfile <( cat <<-EOF

[ v3_ca ]

subjectKeyIdentifier = hash

authorityKeyIdentifier = keyid:always,issuer

basicConstraints = critical,CA:true

keyUsage = critical, digitalSignature, keyCertSign

EOF

)

使用中间CA的私钥对目标CA的CSR进行签名,生成目标证书。

D 校验中间证书

openssl verify -CAfile rootCA.cer intermediateCA.cer

使用根证书来验证中间证书的有效性。

E 校验目标证书

openssl verify -CAfile rootCA.cer -untrusted intermediateCA.cer targetCA.cer

使用根证书和中间证书(作为不信任的CA)来验证目标证书的有效性。

F 签名、提取公钥、验签

F.1 签名

openssl dgst -sha256 -sign targetCA.key -out signature.sig data

使用目标CA的私钥对数据文件data进行SHA-256哈希签名,并将签名保存到signature.sig。

F.2 提取公钥

openssl x509 -pubkey -noout -in targetCA.cer > targetCA_pub.key

从目标CA证书中提取公钥,并保存到targetCA_pub.key文件。

F.3 验签

openssl dgst -sha256 -verify targetCA_pub.key -signature signature.sig data

使用目标CA的公钥验证签名文件signature.sig是否与数据文件data匹配。

3 证书信息查看

使用openssl x509 -in rootCA.cer -text -noout查看rootCA.cer:

Certificate:

Data:

Version: 3 (0x2)--证书的版本号。版本 3 表示这是一个 X.509v3 证书,它支持更多的扩展和属性。

Serial Number:--证书的唯一序列号,用于识别证书。序列号通常是一个大整数,这里显示为一个长串的十六进制数。

64:16:73:c6:33:09:b8:25:fc:b8:5d:54:19:9c:6a:a7:05:3a:90:3f

Signature Algorithm: sha256WithRSAEncryption--证书的签名算法。

Issuer: C = CN, ST = Beijing, L = Beijing, O = Example Company, OU = IT Department, CN = rootCA.example.com--证书的颁发者信息。

Validity--证书的有效期,包含开始日期(Not Before)和结束日期(Not After)。

Not Before: Sep 7 02:44:12 2024 GMT

Not After : Sep 5 02:44:12 2034 GMT

Subject: C = CN, ST = Beijing, L = Beijing, O = Example Company, OU = IT Department, CN = rootCA.example.com

Subject Public Key Info:--证书持有者的公钥信息。

Public Key Algorithm: rsaEncryption--公钥算法的标识符,这里是 RSA 加密。

Public-Key: (2048 bit)--公钥长度。

Modulus:--RSA公钥的模数,是一个大整数。

00:a4:91:99:d5:b6:b2:1d:6c:2b:6d:d5:a5:99:0d:

...

e3:e7

Exponent: 65537 (0x10001)--RSA公钥的指数,通常为655370x10001),这是一个常用的公共指数。

X509v3 extensions:--X.509 v3证书扩展,提供了额外的信息。

X509v3 Subject Key Identifier:

74:7C:59:8C:E9:19:37:D8:C4:A3:E0:BE:01:3F:83:2E:21:1D:CF:0B

X509v3 Authority Key Identifier:

74:7C:59:8C:E9:19:37:D8:C4:A3:E0:BE:01:3F:83:2E:21:1D:CF:0B

X509v3 Basic Constraints: critical--基本约束,指明证书是否是CA证书。

CA:TRUE

X509v3 Key Usage: critical--密钥用途,指明公钥可以用于哪些操作,如数字签名或证书签名。

Digital Signature, Certificate Sign

Signature Algorithm: sha256WithRSAEncryption

Signature Value:--证书的数字签名值,它是使用颁发者的私钥对证书信息进行加密后的结果。签名值用于验证证书的真实性。

18:50:75:92:ad:f3:5f:5c:9b:27:58:9e:32:5b:84:07:ff:b4:

...

f5:64:a9:5a

将rootCA.cer、intermediateCA.cer、targetCA.cer安装到Windwos后形成证书链:

4 基于SM2、SM3生成证书链并进行签名和验签

4.1 SM2/SM3生成证书链并进行签名和验签

将RSA/SHA256替换成SM2/SM3创建证书链和签名验签如下:

# 生成根证书

openssl ecparam -genkey -name SM2 -param_enc explicit -outform pem -out rootCA.key

openssl req -new -key rootCA.key -out rootCA.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Example Company/OU=IT Department/CN=rootCA.example.com"

openssl x509 -req -days 3650 -in rootCA.csr -signkey rootCA.key -out rootCA.cer -extensions v3_ca -extfile <( cat <<-EOF

[ v3_ca ]

subjectKeyIdentifier = hash

authorityKeyIdentifier = keyid:always,issuer

basicConstraints = critical,CA:true

keyUsage = critical, digitalSignature, keyCertSign

EOF

)

# 生成中间证书

openssl ecparam -genkey -name SM2 -param_enc explicit -outform pem -out intermediateCA.key

openssl req -new -key intermediateCA.key -out intermediateCA.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Example Company/OU=Intermediate CA/CN=intermediateCA.example.com"

openssl x509 -req -days 3650 -in intermediateCA.csr -CA rootCA.cer -CAkey rootCA.key -CAcreateserial -out intermediateCA.cer -extensions v3_ca -extfile <( cat <<-EOF

[ v3_ca ]

subjectKeyIdentifier = hash

authorityKeyIdentifier = keyid:always,issuer

basicConstraints = critical,CA:true

keyUsage = critical, digitalSignature, keyCertSign

EOF

)

# 生成目标证书

openssl ecparam -genkey -name SM2 -param_enc explicit -outform pem -out targetCA.key

openssl req -new -key targetCA.key -out targetCA.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Example Company/OU=Target CA/CN=targetCA.example.com"

openssl x509 -req -days 3650 -in targetCA.csr -CA intermediateCA.cer -CAkey intermediateCA.key -CAcreateserial -out targetCA.cer -extensions v3_ca -extfile <( cat <<-EOF

[ v3_ca ]

subjectKeyIdentifier = hash

authorityKeyIdentifier = keyid:always,issuer

basicConstraints = critical,CA:true

keyUsage = critical, digitalSignature, keyCertSign

EOF

)

# 校验中间证书

openssl verify -CAfile rootCA.cer intermediateCA.cer

# 校验目标证书

openssl verify -CAfile rootCA.cer -untrusted intermediateCA.cer targetCA.cer

#签名、提取公钥、验签

openssl dgst -sm3 -sign targetCA.key -out signature.sig data

openssl x509 -pubkey -noout -in targetCA.cer > targetCA_pub.key

openssl dgst -sm3 -verify targetCA_pub.key -signature signature.sig data

4.2 RSA/SHA256生成根证书和中间证书,SM2/3生成目标证书并进行签名和验签

根证书、中间证书使用RSA/SHA256,目标证书使用SM2/SM3生成证书链,然后使用SM2/SM3进行签名和验签(根证书、中间证书、目标证书都是经过RSA/SHA56签名的;根证书、中间证书的公钥是RSA,目标证书中的公钥是SM2):

# 生成根证书

openssl genrsa -out rootCA.key 2048

openssl req -new -key rootCA.key -out rootCA.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Example Company/OU=IT Department/CN=rootCA.example.com"

openssl x509 -req -days 3650 -in rootCA.csr -signkey rootCA.key -out rootCA.cer -extensions v3_ca -extfile <( cat <<-EOF

[ v3_ca ]

subjectKeyIdentifier = hash

authorityKeyIdentifier = keyid:always,issuer

basicConstraints = critical,CA:true

keyUsage = critical, digitalSignature, keyCertSign

EOF

)

# 生成中间证书

openssl genrsa -out intermediateCA.key 2048

openssl req -new -key intermediateCA.key -out intermediateCA.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Example Company/OU=Intermediate CA/CN=intermediateCA.example.com"

openssl x509 -req -days 3650 -in intermediateCA.csr -CA rootCA.cer -CAkey rootCA.key -CAcreateserial -out intermediateCA.cer -extensions v3_ca -extfile <( cat <<-EOF

[ v3_ca ]

subjectKeyIdentifier = hash

authorityKeyIdentifier = keyid:always,issuer

basicConstraints = critical,CA:true

keyUsage = critical, digitalSignature, keyCertSign

EOF

)

# 生成目标证书

openssl ecparam -genkey -name SM2 -param_enc explicit -outform pem -out targetCA.key

openssl req -new -key targetCA.key -out targetCA.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Example Company/OU=Target CA/CN=targetCA.example.com"

openssl x509 -req -days 3650 -in targetCA.csr -CA intermediateCA.cer -CAkey intermediateCA.key -CAcreateserial -out targetCA.cer -extensions v3_ca -extfile <( cat <<-EOF

[ v3_ca ]

subjectKeyIdentifier = hash

authorityKeyIdentifier = keyid:always,issuer

basicConstraints = critical,CA:true

keyUsage = critical, digitalSignature, keyCertSign

EOF

)

# 校验中间证书

openssl verify -CAfile rootCA.cer intermediateCA.cer

# 校验目标证书

openssl verify -CAfile rootCA.cer -untrusted intermediateCA.cer targetCA.cer

#签名、提取公钥、验签

openssl dgst -sm3 -sign targetCA.key -out signature.sig data

openssl x509 -pubkey -noout -in targetCA.cer > targetCA_pub.key

openssl dgst -sm3 -verify targetCA_pub.key -signature signature.sig data

经由openssl x509 -in targetCA.cer -text -noout查看SM2/SM3生成的证书信息如下:

Certificate:

Data:

Version: 3 (0x2)

Serial Number:

...

Signature Algorithm: SM2-with-SM3--这里使用的是中国国家密码管理局推荐的SM2椭圆曲线算法和SM3哈希算法。

Issuer: C = CN, ST = Beijing, L = Beijing, O = Example Company, OU = IT Department, CN = rootCA.example.com

Validity

Not Before: Sep 14 06:53:23 2024 GMT

Not After : Sep 12 06:53:23 2034 GMT

Subject: C = CN, ST = Beijing, L = Beijing, O = Example Company, OU = IT Department, CN = rootCA.example.com

Subject Public Key Info:

Public Key Algorithm: id-ecPublicKey--公钥算法的标识符,这里是椭圆曲线公钥(EC)。

Public-Key: (256 bit)

pub:

04:

cf:84:66:b6 e9:ee:94:54 53:8d:4c:a7 ab:4a:5d:5a

9b:e2:5a:22 b8:fd:53:d8 84:09:1d:46 f7:1d:ee:ee

8c:86:93:e0 3f:46:19:d7 73:32:41:3a cd:ee:ef:bb

28:d2:f2:48 60:0c:07:4d 57:f9:e4:93 af:72:fc:55

Field Type: prime-field--椭圆曲线的字段类型,这里是素数字段(prime-field)。

Prime:--素数 p,用于定义椭圆曲线。

00:

ff:ff:ff:fe ff:ff:ff:ff ff:ff:ff:ff ff:ff:ff:ff

ff:ff:ff:ff 00:00:00:00 ff:ff:ff:ff ff:ff:ff:ff

A:--椭圆曲线方程 y^2 = x^3 + Ax + B 的系数。

00:

ff:ff:ff:fe ff:ff:ff:ff ff:ff:ff:ff ff:ff:ff:ff

ff:ff:ff:ff 00:00:00:00 ff:ff:ff:ff ff:ff:ff:fc

B:

28:e9:fa:9e 9d:9f:5e:34 4d:5a:9e:4b cf:65:09:a7

f3:97:89:f5 15:ab:8f:92 dd:bc:bd:41 4d:94:0e:93

Generator (uncompressed):--椭圆曲线的基点(generator point),用于生成密钥对。

04:

32:c4:ae:2c 1f:19:81:19 5f:99:04:46 6a:39:c9:94--xG

8f:e3:0b:bf f2:66:0b:e1 71:5a:45:89 33:4c:74:c7

bc:37:36:a2 f4:f6:77:9c 59:bd:ce:e3 6b:69:21:53--yG

d0:a9:87:7c c6:2a:47:40 02:df:32:e5 21:39:f0:a0

Order:--基点的阶数,表示生成密钥对时可用的密钥数量。

00:

ff:ff:ff:fe:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:72:03:df:6b:21:c6:05:2b:53:bb:f4:09:39:d5:41:23

Cofactor: 1 (0x1)--椭圆曲线的配数,用于某些特殊的加密算法。

X509v3 extensions:

X509v3 Subject Key Identifier:

...

X509v3 Authority Key Identifier:

...

X509v3 Basic Constraints: critical

CA:TRUE

X509v3 Key Usage: critical

Digital Signature, Certificate Sign

Signature Algorithm: sha256WithRSAEncryption--签名算法再次声明,强调证书的签名是使用了RSA加密技术和SHA-256哈希算法生成的。

Signature Value:

...

参考文档《OpenSSL生成SM2证书链 | 生如夏花的博客 (blduan.top)》。

相关推荐

蓝洁瑛(Yammie Nam)

蓝洁瑛(Yammie Nam)

📅 08-25 👁️ 3241
河南“弹药墓”藏数千炮弹

河南“弹药墓”藏数千炮弹

📅 09-19 👁️ 7702
叮咚音响/音箱报价,叮咚音响/音箱价格表