我知道如何使用 openssl 命令行创建 x509 证书。但现在我想创建一个带有自定义扩展的证书。如何使用 openssl 命令行执行此操作?
答案1
以下是在签署 S/MIME 用户证书时添加一组 S/MIME 客户端功能扩展的示例,取自OpenSSL 邮件列表中的一个例子:
[my_cert_extensions]
basicConstraints = CA:FALSE
keyUsage = critical, keyEncipherment, dataEncipherment
SMIME-CAPS = ASN1:SEQUENCE:smime_seq
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
[ smime_seq ]
SMIMECapability.0 = SEQWRAP,OID:sha1
SMIMECapability.1 = SEQWRAP,OID:sha256
SMIMECapability.2 = SEQWRAP,OID:sha1WithRSA
SMIMECapability.3 = SEQWRAP,OID:aes-256-ecb
SMIMECapability.4 = SEQWRAP,OID:aes-256-cbc
SMIMECapability.5 = SEQWRAP,OID:aes-256-ofb
SMIMECapability.6 = SEQWRAP,OID:aes-128-ecb
SMIMECapability.7 = SEQWRAP,OID:aes-128-cbc
SMIMECapability.8 = SEQWRAP,OID:aes-128-ecb
SMIMECapability.9 = SEQUENCE:rsa_enc
[ rsa_enc ]
capabilityID = OID:rsaEncryption
parameter = NULL
openssl
此功能可以通过使用命令行选项等方式激活-extensions my_cert_extensions
。
这个难题还有另外两个部分:
- 有关如何构建扩展数据的更多详细信息,请参阅 OpenSSL API 文档这里,但你需要了解一点ASN.1和对象标识符去理解这一点。
- 如果你的扩展确实是自定义的,那么你可能应该申请向 IANA 申请私有企业号码(如果您的扩展可能会在野外被看到,则必须这样做)
如果你想使用现存的扩展通常会更容易一些,如果你有:
[ CA_default ]
...
x509_extensions = usr_cert
[ usr_cert ]
basicConstraints=CA:FALSE
...
nsComment = "This is my comment"
CA_default
在正常 CA 签名期间使用,如果您可以使用预定义扩展,那么您所要做的就是将其添加到该usr_cert
部分,不需要额外的命令行选项。(nsComment
从技术上讲已被弃用,但仍然有效,这是一个简单的例子,可以在常用浏览器的证书属性中轻松查看)。
查看x509v3_config
手册页解释了扩展基础知识和 OpenSSL 源代码加密/对象/对象.txt对于有些神秘的细节(此文件被处理并用于生成代码)。
OID 通常与离散概念相关联,例如名词, A动词, 一个属性甚至是一些不那么有形的东西(比如 UUID,但是是分层的)。评论具有明确的含义(证书内的自由格式文本注释),其他类似keyUsage
具有更严格的语义。
在 OpenSSL 中,名称“nsComment”映射到 OID 2.16.840.1.113730.1.13,如 中设置objects.txt
。X.509v3 证书中的每个扩展都有一个 OID,请参阅https://stackoverflow.com/questions/15299201/asn-1-octet-strings。
如果 OpenSSL 中没有合适的扩展(请参阅RFC 5280 §4.2 证书扩展),您可能能够找到一个并添加它(请参阅x509v3_config
上面链接的手册页中的“任意扩展”部分)。否则,您将需要为自己的目的定义 OID。
答案2
将自定义扩展添加到自定义 openssl.cnf 配置文件或特定扩展文件中,并在命令行中引用该文件,例如
openssl ca -config ./my-openssl.cnf -extensions ./my-openssl-extensions.cnf <options>
从手册页:
-extensions 部分 配置文件中包含颁发证书时要添加的证书扩展的部分(默认为 x509_extensions,除非使用了 -extfile 选项)。如果不存在扩展部分,则将创建 V1 证书。如果存在扩展部分(即使它是空的),则将创建 V3 证书。有关
x509v3_config(5)
扩展部分格式的详细信息,请参阅手册页。