OpenSSL使用自定义主题字段生成和签署证书

时间:2011-06-28 07:34:54

标签: certificate openssl pki x509 asn.1

我需要使用自定义主题(,SERIALNUMBER = ...,)创建并签署(我是CA)证书。

到目前为止,我已经修改了openssl配置文件,因此我可以在主题中包含自定义字段。

[ new_oids ]
SERIALNUMBER = 1.2.3.4.1333

问题是,签署此类证书后,新字段会以奇怪的数字格式显示 -

C = FI
O = Maahanmuuttovirasto
1.2.3.4.1333 = 00REINIS00

我应该在openssl配置文件中更改哪些内容以及使用正常字段名称生成证书?如何告知签名过程1.2.3.4.1333应编码为'SERIALNUMBER'。

谢谢你, 牛肉

1 个答案:

答案 0 :(得分:4)

实际上根本没有错误。存储在证书主题中的内容是DistinguishedName。参看RFC 5280

TBSCertificate  ::=  SEQUENCE  {
     version         [0]  Version DEFAULT v1,
     serialNumber         CertificateSerialNumber,
     signature            AlgorithmIdentifier,
     issuer               Name,
     validity             Validity,
     subject              Name,
     subjectPublicKeyInfo SubjectPublicKeyInfo,
     issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL,
                          -- If present, version MUST be v2 or v3
     subjectUniqueID [2]  IMPLICIT UniqueIdentifier OPTIONAL,
                          -- If present, version MUST be v2 or v3
     extensions      [3]  Extensions OPTIONAL
                          -- If present, version MUST be v3 --  }

所以主题是Name,这被定义为

Name ::= CHOICE { -- only one possibility for now --
      rdnSequence  RDNSequence }

RDNSequence ::= SEQUENCE OF RelativeDistinguishedName

RelativeDistinguishedName ::= SET SIZE (1..MAX) OF AttributeTypeAndValue

AttributeTypeAndValue ::= SEQUENCE {
     type     AttributeType,
     value    AttributeValue }

AttributeType ::= OBJECT IDENTIFIER

AttributeValue ::= ANY -- DEFINED BY AttributeType

正如您所看到的,主题由一系列RelativeDistingsuishedNames组成,每个名称代表一对oid加上指定的值。这意味着您的证书中没有任何地方' SERIALNUMBER'将被存储,但只存储oid的值,1.2.3.4.1333。应用程序将这些oid解释为有意义的东西,并且有许多常见的oid,大多数应用程序都知道并将使用字符串表示,例如" C"," O& #34;," OU"," CN"等等(参见RFC 2253RFC 1779)。

但是' SERIALNUMBER'默认情况下OpenSSL是未知的,事实上,您自己将其添加到new_oids。因此,OpenSSL不知道如何表示' SERIALNUMBER'除了打印OID本身。但任何其他知道' SERIALNUMBER' (IIRC Windows / IE是)将正确显示为' SERIALNUMBER'。