通过 Openssl 实操详解 X509 V3 扩展

737 阅读2分钟

有几种 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。