美好的一天! 我创建了一个证书请求,结果如下:
-----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中获得我的扩展名。我做错了什么?
答案 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),那么您违反了另一个要求:
证书用户必须能够处理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"。
的序列号文件
只需将所需的序列号写入文件即可使用。