有几种 OpenSSL 命令可以通过配置文件或 -addext 选项向 CA 或 CSR 添加扩展。
1. 配置文件
/etc/ssl/openssl.cnf
HOME = /temp
configdir = $ENV::HOME/config
[ section_one ]
# 引号允许前后有空格
any = " any variable name "
other = A string that can \
cover several lines \
by including \ characters
message = Hello World\n
[ section_two ]
greeting = $section_one::message
(1) -addextv3 配置 此页面使用扩展作为部分的名称。 扩展部分中的每个条目采用以下形式: name = [critical, ]value(s) 注意:(2) 值部分可以是多值,用逗号分隔。每个值的格式:
- value
- name:value
- @section_name
(3) 如果值中包含逗号,我们必须使用长格式。 例如,下面的格式会导致错误信息:
subjectAltName = URI:ldap://somehost.com/CN=foo,OU=bar
正确的方法是使用长格式,如下所示:
[extensions]
subjectAltName = @subject_alt_section
[subject_alt_section]
subjectAltName = URI:ldap://somehost.com/CN=foo,OU=bar
OpenSSL 不支持在一个部分中多次出现相同的字段。在此示例中:
[extensions]
subjectAltName = @alt_section
[alt_section]
email = steve@example.com
email = steve@example.org
只会识别最后一个值。 要指定多个值,请附加一个数字标识符,如下所示:
[extensions]
subjectAltName = @alt_section
[alt_section]
email.1 = steve@example.com
email.2 = steve@example.org
2. 标准扩展
(1) 基本约束
basicConstraints = critical, CA:TRUE, pathlen:1
注意: CA 证书必须包含 basicConstraints 名称,并将 CA 参数设置为 TRUE。 终端用户证书必须要么有 CA:FALSE,要么完全省略该扩展。 pathlen 指定在链中可以出现在此 CA 之下的最大 CA 数量。 pathlen 为零意味着 CA 不能签署任何子 CA,只能签署终端实体证书。
(2) 密钥用途
密钥用途包含允许的密钥用途名称列表。定义的值有:
- digitalSignature
- nonRepudiation
- keyEncipherment
- dataEncipherment
- keyAgreement
- keyCertSign
- cRLSign
- encipherOnly
- decipherOnly
示例:
keyUsage = digitalSignature, nonRepudiation
keyUsage = critical, keyCertSign
密钥用途通常用于 CA 证书。然而,由于它会阻止其用作测试自签名证书,最好默认省略。
# keyUsage = cRLSign, keyCertSign
(3) 扩展密钥用途
指定证书公钥可以使用的目的。
值 根据 RFC 5280 等的含义
----- ----------------------------------
serverAuth SSL/TLS WWW 服务器认证
clientAuth SSL/TLS WWW 客户端认证
codeSigning 代码签名
emailProtection 电子邮件保护 (S/MIME)
timeStamping 可信时间戳
OCSPSigning OCSP 签名
ipsecIKE ipsec 互联网密钥交换
msCodeInd 微软个人代码签名 (authenticode)
msCodeCom 微软商业代码签名 (authenticode)
msCTLSign 微软信任列表签名
msEFS 微软加密文件系统
示例:
extendedKeyUsage = critical, codeSigning, 1.2.3.4
extendedKeyUsage = serverAuth, clientAuth
(4) 主题密钥标识符 (SKID)
三种选项:
- none
- hash
- [hex_value]
subjectKeyIdentifier = hash
(5) 授权密钥标识符 (AKID)
- 自签名证书:none
- 由 CA 签发:keyid, issuer
authorityKeyIdentifier = keyid, issuer:always
authorityKeyIdentifier = keyid, issuer
(6) 主题备用名称
支持多种名称标识符,包括: email, URI, DNS, RID, IP, dirName, otherName
示例
subjectAltName = email:copy, email:my@example.com, URI:http://my.example.com/
subjectAltName = IP:192.168.7.1
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
(7) 发行者备用名称支持 subjectAltName 中的所有选项,除了 email:copy,还添加了 issuer:copy,它会从发行者证书中复制任何主题备用名称:
issuerAltName = issuer:copy
全文完!
如果你喜欢我的文章,欢迎关注我的微信公众号 deliverit。