openssl忽略序列号扩展名

时间:2015-12-17 16:56:32

标签: openssl x509

美好的一天! 我创建了一个证书请求,结果如下:

-----BEGIN CERTIFICATE REQUEST-----
MIICszCCAZsCAQAwKzEKMAgGA1UEChMBczEQMA4GA1UECxMHb3JnVW5pdDELMAkG
A1UEAxMCY24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4p/WHGkLZ
DGuUenb8e+FtwimfPQvAGJU4IwVKgjjk3cqqdED2PgyeSKQEehyWdnEaGaKdDQ72
unsPfOeRYAbzhEeKNM0qH/jx5gC5CO0/lq58UQOtBg4GXMLCMel+QIofBb1UGbLo
KviHLR02jfqYrUf72GY83JrhUGlzAJEl6upDvuZalp5qXql9ge8ylfGx/iOUYPk7
/gvfTOLDQmDKcUQ9nW8H9U+cl82lcsBMv7V4XCoG16GfEIziLyFHtLwvAwvGE2md
IEnoMwhY0cUxp/c8bzL0hvNvMDy1lNBJ14wohdTh95/Guf46d8DtWc7e1Nrb+biT
HxWsftA4WEQdAgMBAAGgQzBBBgkqhkiG9w0BCQ4xNDAyMDAGA1UEBQQpVURJRDow
MDAwMDAwMC03YTBlLTkyNTUtZmZmZi1mZmZmYmY4ZmYyZDUwDQYJKoZIhvcNAQEL
BQADggEBAEm8HXmmxZ7B6Omcezuhle1Xz/9Iiaet2SnkSwm0dVmZXzyamWFHSls+
1biMtZb3Ath0TeDQ7kUh40SyFBKOTSWD8EhbgsMrys0ALUOJ16r2mGXbVdnoc/52
dm8jKXSqB/tKa4AXDQJkR6GNJtNu3k4XHSz25felkZosqGHdPmnQGiPDpJsFenxm
yD+nYTUrzrMM4FrBKLDex4mT0raFEkxN52wIwQ+UtI84OfxebztKSr+WCeafCKnV
idQrTBcM5zMdAPSgKIdh2kFOr3WdXgLonQiQ8GVleBdFGy0aw1LRVZ3+XsIrnEx2
L1dRm4u70iXtUwYw5tSaK6KNT7SJo00=
-----END CERTIFICATE REQUEST-----

用两个词 - 它说:

cn
Certificate request

Public Key Info
Key Algorithm:  RSA
Key Parameters: 05 00
Key Size:   2048
Key SHA1 Fingerprint:   E4 .. E9 49 A3 D3

Public Key: 30 82 01 0A 02 82 01 01 ... 03 01 00 01

现在最重要的是:

Extension
Identifier: Serial Number
Value:  55 44 49 44 3A 30 30 30 30 30 30 30 30 2D 37 61 30 65 2D 39 32     35 35 2D 66 66 66 66 2D 66 66 66 66 62 66 38 66 66 32 64 35
Critical:   No

我希望此扩展序列号在我的未来证书中。 但是,当我做像

这样的事情
openssl x509 -req -in ../req.req -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out user.crt -days 5000 -extensions v3_usr -CAcreateserial

我没有在结果user.cer中获得我的扩展名。我做错了什么?

3 个答案:

答案 0 :(得分:2)

我怀疑有几个问题。

首先,您的扩展程序值不正确。它错过了extnValue字段的嵌套ASN.1类型标识符。根据{{​​3}},X.509 Extension是:

Extension  ::=  SEQUENCE  {
     extnID      OBJECT IDENTIFIER,
     critical    BOOLEAN DEFAULT FALSE,
     extnValue   OCTET STRING
                 -- contains the DER encoding of an ASN.1 value
                 -- corresponding to the extension type identified
                 -- by extnID
     }

extnValue(即OCTET_STRING)下,您应该设置嵌套类型(我不知道序列号扩展的确切语法)。它可以是SEQUENCE,另一个OCTET_STRING或INTEGER(因为序列号是整数)。

但是,您的嵌套类型丢失了: RFC5280 在选定的OCTET_STRING下应该有另一个嵌套节点,同时,您将序列号直接放置为extnValue有效负载。

如果此扩展程序旨在指示CA在证书中放置指定的序列号(作为FIELD),那么您违反了另一个要求:

  

enter image description here

     

证书用户必须能够处理serialNumber值   最多20个八位字节。符合CA不得使用serialNumber值   超过20个八位字节。

您的序列号看起来有点长于20个八位字节。此外,您可能违反了本节的第一部分:

  

对于给定CA颁发的每个证书,它必须是唯一的(即,   发行人名称和序列号标识唯一的证书。)

也就是说,如果用户要求提供特定的序列号,可能会导致序列号非唯一性。

修改 根据Ilya Matveychikov的说法,嵌套类型应为 PrintableString 。这意味着您的扩展程序值应为:

13 2B 55 44 49 44 3A 30  30 30 30 30 30 30 30 2D
37 61 30 65 2D 39 32 35  35 2D 66 66 66 66 2D 66
66 66 66 62 66 38 66 66  32 64 35

编码时,它看起来如下: §4.1.2.2

答案 1 :(得分:1)

根据OID 2.5.4.5定义,必须PrintableString放置extnValue

serialNumber ATTRIBUTE ::= {
    WITH SYNTAX PrintableString (SIZE (1..ub-serialNumber))
    EQUALITY MATCHING RULE caseIgnoreMatch
    SUBSTRINGS MATCHING RULE caseIgnoreSubstringsMatch
    ID id-at-serialNumber
}

答案 2 :(得分:0)

您使用-CAcreateserial选项。它记录为:

  

-CAcreateserial

     

使用此选项可以创建CA序列号文件(如果它不存在):它将包含序列号" 02"并且签署的证书将使用1作为其序列号。如果指定了-CA选项且序列号文件不存在,则生成随机数;这是推荐的做法。

要明确设置序列号,您可能希望改为使用选项-CAserial

  

-CAserial filename

     

设置要使用的CA序列号文件。

     

当-CA选项用于签署证书时,它使用文件中指定的序列号。此文件由一行包含偶数个十六进制数字和要使用的序列号组成。每次使用后,序列号会递增并再次写入文件。

     

默认文件名由CA证书文件基本名称和" .srl"组成。追加。例如,如果CA证书文件被调用" mycacert.pem"它希望找到一个名为" mycacert.srl"。

的序列号文件

只需将所需的序列号写入文件即可使用。