Openssl自定义扩展

我知道如何使用openssl命令行创buildx509证书。 但现在我想创build一个自定义的扩展。 我怎样才能用openssl命令行来做到这一点?

以下是在签署S / MIME用户证书时添加一组S / MIME客户端function扩展的示例 ,取自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等方式激活的。

还有两个难题:

  • 有关如何构build扩展数据的更多细节,请参阅OpenSSL API文档,但您需要了解一些有关ASN.1和OID的内容。
  • 如果您的扩展程序确实是自定义的,那么您可能应该向IANA申请私人企业号码 (如果您的扩展程序可能在野外被看到,这是必须的)

如果您希望使用现有的扩展名添加文本,通常会更容易一些,如果您拥有:

 [ CA_default ] ... x509_extensions = usr_cert [ usr_cert ] basicConstraints=CA:FALSE ... nsComment = "This is my comment" 

在正常的CA签名期间使用CA_default ,如果您可以使用预定义的扩展名,那么您只需将其添加到usr_cert部分,不需要额外的命令行选项。 ( nsComment在技​​术上已被弃用,但仍然nsComment ,这是一个简单的例子,可以在普通浏览器的证书属性中轻松查看)。

请参阅说明扩展基础知识的x509v3_config手册页 ,以及OpenSSL源代码crypto / objects / objects.txt,以获取有关详细信息(此文件已处理并用于生成代码)的详细信息。

一个OID通常与一个离散的概念相关联,比如名词动词属性 ,甚至是不那么有形的东西。 nsComment具有定义的含义(证书内的自由forms文本注释),其他像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证书扩展),您可以find并添加它(请参阅上面链接的x509v3_config手册页中的“任意扩展”部分)。 否则,您将需要为您自己的目的定义OID。

将自定义扩展添加到自定义的openssl.cnfconfiguration文件或特定的扩展文件,并在命令行上引用该扩展

 openssl ca -config ./my-openssl.cnf -extensions ./my-openssl-extensions.cnf <options> 

从手册页:

-extensions部分是configuration文件的一部分,其中包含证书发布时要添加的证书扩展(除非使用-extfile选项,否则缺省为x509_extensions)。 如果没有扩展部分,则创build一个V1证书。 如果扩展部分存在(即使它是空的),则创build一个V3证书。 有关扩展部分格式的详细信息,请参见x509v3_config(5)手册页。