这实际上根本没有错误。存储在证书主题中的是 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 -- }
所以主题是 a 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”、“OU”、“CN”等(参见RFC 2253或RFC 1779)。
但是默认情况下,OpenSSL 不知道“SERIALNUMBER”,实际上,您正在将它添加到new_oids
自己。因此,除了打印 OID 本身,OpenSSL 不知道如何表示“SERIALNUMBER”。但是任何其他知道“SERIALNUMBER”(IIRC Windows/IE 是)的软件都会将其正确显示为“SERIALNUMBER”的值。