【问题标题】:openssl ignores Serial number extension [closed]openssl 忽略序列号扩展[关闭]
【发布时间】:2015-12-17 16:56:31
【问题描述】:

美好的一天! 我创建了一个具有这样结果的证书请求:

-----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 中获得我的扩展名。我做错了什么?

【问题讨论】:

标签: openssl x509


【解决方案1】:

我怀疑有几个问题。

首先,您的扩展值格式不正确。它错过了 extnValue 字段的嵌套 ASN.1 类型标识符。根据RFC5280,X.509 扩展名是:

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(因为序列号是整数)。

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

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

§4.1.2.2

证书用户必须能够处理 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

编码后如下所示:

【讨论】:

    【解决方案2】:

    根据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
    }
    

    【讨论】:

      【解决方案3】:

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

      -CAcreateserial

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

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

      -CAserial 文件名

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

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

      默认文件名由附加“.srl”的 CA 证书文件基本名称组成。例如,如果 CA 证书文件名为“mycacert.pem”,它希望找到一个名为“mycacert.srl”的序列号文件。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-19
        • 2017-01-22
        • 2012-09-22
        • 1970-01-01
        • 1970-01-01
        • 2013-08-04
        • 1970-01-01
        相关资源
        最近更新 更多