警告
本文最后更新于 2021-05-20 11:57,文中内容可能已过时。
###官方文档:
证书扩展rfc 5280: https://datatracker.ietf.org/doc/html/rfc5280#section-4.2
openssl: https://www.openssl.org/docs/man1.0.2/man5/x509v3_config.html
###下面介绍几个扩展项
1.basicConstraints
用于确定证书是否可以给其他人颁发证书,写法如下
1
2
3
4
5
| basicConstraints=CA:TRUE # 可以颁发
basicConstraints=CA:FALSE # 不可以颁发
basicConstraints=critical,CA:TRUE, pathlen:0 # 将此扩展项设置为critical(关键),CA:TRUE表示允许给其他人签发证书,pathlen:0表示这个证书下可以有多少个CA机构,0代表没有,即只能颁发最终实体证书
|
** critical说明: **
如果遇到无法识别的关键扩展或包含无法处理的信息的关键扩展,则使用证书的系统必须拒绝该证书。
2.Key Usage
指定证书中包含的密钥用途(例如,加密、签名、证书签名)。可选项: digitalSignature
, nonRepudiation(以后可能会叫contentCommitment)
, keyEncipherment
, dataEncipherment
, keyAgreement
, keyCertSign
, cRLSign
, encipherOnly
, decipherOnly
1
| keyUsage=critical,digitalSignature,keyEncipherment # 设置为关键扩展项,使用公钥进行数字签名和密钥加密,一般的https都是这样的配置
|
3.Extended Key Usage
指定使用证书公钥的目的。
serverAuth
: SSL/TLS Web Server Authentication # 服务端认证
clientAuth
: SSL/TLS Web Client Authentication # 客户端认证
codeSigning
: Code signing # 代码签名
emailProtection
: E-mail Protection (S/MIME) # 邮件保护
timeStamping
: Trusted Timestamping # 可信时间戳
OCSPSigning
: OCSP Signing # OCSP签名
1
| extendedKeyUsage = serverAuth, clientAuth # 作为服务端认证和客户端认证使用
|
4.Subject Key Identifier
当前证书的密钥标识符(SKID)
1
| subjectKeyIdentifier = hash # 自动获取当前证书hash值
|
5.Authority Key Identifier
当前证书颁发者的证书的密钥标识符。
keyid
: 尝试计算公钥哈希值(如果证书是自签名的)。或者从颁发者证书复制主题密钥标识符(SKID)。如果失败,并且指定了’always’选项,则返回一个错误。
issuer
: 如果指定’always’选项,或者不存在密钥标识(keyid),那么将从制颁发证书中复制"DN"和序列号。
上面属于强行解释,我也不太理解。
1
2
3
| authorityKeyIdentifier = keyid, issuer
authorityKeyIdentifier = keyid, issuer:always
|
6.Subject Alternative Name
主题备用名称
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # email:copy,从DN中复制。
subjectAltName = email:copy, email:my@example.com, URI:http://my.example.com/
# ipv4
subjectAltName = IP:192.168.7.1
# ipv6
subjectAltName = IP:13::17
subjectAltName = email:my@example.com, RID:1.2.3.4
subjectAltName = otherName:1.2.3.4;UTF8:some other identifier
[extensions]
subjectAltName = dirName:dir_sect
[dir_sect]
C = UK
O = My Organization
OU = My Unit
CN = My Name
|
我在测试的时候的命令和配置:
1
| openssl ca -in soulchild.com.csr -extfile ext.cnf
|
ext.cnf内容:
1
2
3
4
5
6
7
8
9
10
11
| subjectAltName=critical,DNS.1:it.soulchild.com,IP.1:127.0.0.1,email:copy,dirName:dir_sect
extendedKeyUsage=serverAuth
keyUsage=critical,digitalSignature,keyEncipherment
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
[dir_sect]
C = UK
O = My Organization
OU = My Unit
CN = My Name
|