5. 使用 RFC 7030 原始方法的示例 (Examples Using the Original Approach in RFC 7030)
本节给出使用 RFC 7030 原始 CSR Attributes 方法的若干编码示例. 每个示例先说明服务器期望客户端在 CSR 中包含哪些属性或扩展, 然后给出 Base64 DER 编码, 最后用 dumpasn1 输出展开内部结构. Base64 字符串, OID, DER 长度, ASN.1 dump 和对象名称都是测试向量的一部分, 必须保持原样.
这些示例覆盖几类典型需求: 要求 RFC 8994/ACP 使用特定 otherName 形式的 subjectAltName; 使用 RFC 7030 原始示例中的 challengePassword, ecPublicKey, macAddress 和签名哈希算法; 要求具体 subjectAltName 扩展; 要求特定大小的 RSA 公钥; 要求特定曲线的 ECC 公钥; 以及同时要求特定扩展和多个属性. 中文说明帮助读者理解每个示例的意图, 代码块中的编码内容则用于实现测试和互操作验证.
阅读 dump 输出时, 可以重点观察 CsrAttrs 结构中哪些元素是裸 OID, 哪些元素是带 SET 值的 Attribute, 以及 id-ExtensionReq 如何承载 X.509 Extensions. 这正是 RFC 9908 要澄清的核心: EST 服务器既可以指出需要哪些属性类型, 也可以在语法允许的情况下给出要求客户端使用的具体值.
示例内容
5. 使用 RFC 7030 原始方法的示例
每个示例都从较高层次说明预期内容. 其中还包含到前文 Attribute 和
Extension 定义的部分映射. 随后给出 base64 DER 编码. 最后提供
"dumpasn1" [dumpasn1] 的输出, 以详细展示其内容.
5.1. 要求带有特定 otherName 的 RFC 8994 / ACP subjectAltName
单个 subjectAltName 扩展在单个 CsrAttrs 属性 [RFC7030] 中指定,
其中 OID 'id-ExtensionReq' 表示 Extensions 类型. 这可能由要求
使用 'otherNames' 格式的 AcpNodeName [RFC8994] 的 Registrar [RFC8995]
创建.
5.1.1. Base64 编码示例
Base64:
MGgwZgYJKoZIhvcNAQkOMVkwVzBVBgNVHREBAf8ESzBJoEcG
CCsGAQUFBwgKoDsWOXJmYzg5OTQrZmQ3MzlmYzIzYzM0NDAx
MTIyMzM0NDU1MDAwMDAwMDArQGFjcC5leGFtcGxlLmNvbQ==
5.1.2. ASN.1 DUMP 输出
存在一个 subjectAltName Extension, 其 Attribute 带有 Extension 类型.
<30 68>
0 104: SEQUENCE {
<30 66>
2 102: SEQUENCE {
<06 09>
4 9: OBJECT IDENTIFIER
: extensionRequest (1 2 840 113549 1 9 14)
: (PKCS #9 via CRMF)
<31 59>
15 89: SET {
<30 57>
17 87: SEQUENCE {
<30 55>
19 85: SEQUENCE {
<06 03>
21 3: OBJECT IDENTIFIER
: subjectAltName (2 5 29 17)
: (X.509 extension)
<01 01>
26 1: BOOLEAN TRUE
<04 4B>
29 75: OCTET STRING, encapsulates {
<30 49>
31 73: SEQUENCE {
<A0 47>
33 71: [0] {
<06 08>
35 8: OBJECT IDENTIFIER '1 3 6 1 5 5 7 8 10'
<A0 3B>
45 59: [0] {
<16 39>
47 57: IA5String
: 'rfc8994+fd739fc23c34401122334455'
: '[email protected]'
: }
: }
: }
: }
: }
: }
: }
: }
: }
5.2. RFC 7030 中的原始示例
此示例取自 [RFC7030] 第 4.5.2 节, 其中包含若干不同属性. 示例中
'macAddress' 部分的原始编码并不正确. 它未与 [RFC2985] 第 5.4.2 节
规定的 Extension Request 属性定义对齐. 此处给出的修订编码没有使用
'id-ExtensionReq' 属性, 因为 MAC Address 本身不是 X.509 证书扩展,
且服务器提供的是不带值的 OID, 这种形式在 'Extension' 类型结构中
语法上不允许.
5.2.1. Base64 编码示例
Base64:
MDIGCSqGSIb3DQEJBzASBgcqhkjOPQIBMQcGBSuBBAAiBgcr
BgEBAQEWBggqhkjOPQQDAw==
5.2.2. ASN.1 DUMP 输出
CsrAttrs 结构包含:
1. challengePassword 属性, 用于指示 CSR 应包含此值.
2. 带有 secp384r1 值的 ecPublicKey OID, 用于指示应提交哪种公钥.
3. macAddress OID 1.3.6.1.1.1.1.22, 用于指示预期 CSR 在
subjectDirectoryAttributes 扩展中包含 MAC 地址值.
4. ecdsaWithSHA384 OID, 用于指示 PKCS#10 CSR 中自签名预期使用的
哈希类型.
<30 32>
0 50: SEQUENCE {
<06 09>
2 9: OBJECT IDENTIFIER challengePassword (1 2 840 113549 1 9 7)
: (PKCS #9)
<30 12>
13 18: SEQUENCE {
<06 07>
15 7: OBJECT IDENTIFIER ecPublicKey (1 2 840 10045 2 1)
: (ANSI X9.62 public key type)
<31 07>
24 7: SET {
<06 05>
26 5: OBJECT IDENTIFIER secp384r1 (1 3 132 0 34)
: (SECG (Certicom) named elliptic curve)
: }
: }
<06 07>
33 7: OBJECT IDENTIFIER '1 3 6 1 1 1 1 22'
<06 08>
42 8: OBJECT IDENTIFIER ecdsaWithSHA384 (1 2 840 10045 4 3 3)
: (ANSI X9.62 ECDSA algorithm with SHA384)
: }
5.3. 要求特定 subjectAltName 扩展
此示例与前一示例相同, 但使用 subjectAltName 作为唯一 Extension 元素,
而不是 macAddress 的 OID.
5.3.1. Base64 编码示例
Base64:
MEUGCSqGSIb3DQEJBzASBgcqhkjOPQIBMQcGBSuBBAAjBgkq
hkiG9w0BCRQGCgmSJomT8ixkAQUGA1UEBQYIKoZIzj0EAwQ=
5.3.2. ASN.1 DUMP 输出
CsrAttrs 结构包含:
1. challengePassword 属性, 用于指示 CSR 应包含此值.
2. 带有 secp521r1 值的 ecPublicKey OID, 用于指示应提交哪种公钥.
3. 一个 extensionRequest 容器, 其中的 subjectAltName 值包含名称
[email protected].
4. ecdsaWithSHA512 OID, 用于指示 PKCS#10 CSR 中自签名预期使用
SHA-512 哈希.
<30 45>
0 69: SEQUENCE {
<06 09>
2 9: OBJECT IDENTIFIER challengePassword (1 2 840 113549 1 9 7)
: (PKCS #9)
<30 12>
13 18: SEQUENCE {
<06 07>
15 7: OBJECT IDENTIFIER ecPublicKey (1 2 840 10045 2 1)
: (ANSI X9.62 public key type)
<31 07>
24 7: SET {
<06 05>
26 5: OBJECT IDENTIFIER secp521r1 (1 3 132 0 35)
: (SECG (Certicom) named elliptic curve)
: }
: }
<06 09>
33 9: OBJECT IDENTIFIER friendlyName (for PKCS #12)
(1 2 840 113549 1 9 20)
: (PKCS #9 via PKCS #12)
<06 0A>
44 10: OBJECT IDENTIFIER '0 9 2342 19200300 100 1 5'
<06 03>
56 3: OBJECT IDENTIFIER serialNumber (2 5 4 5)
: (X.520 DN component)
<06 08>
61 8: OBJECT IDENTIFIER ecdsaWithSHA512 (1 2 840 10045 4 3 4)
: (ANSI X9.62 ECDSA algorithm with SHA512)
: }
5.4. 要求特定大小的公钥
CSR 要求特定大小的 RSA 公钥.
5.4.1. Base64 编码示例
Base64:
MCkGCSqGSIb3DQEJBzARBgkqhkiG9w0BAQExBAICEAAGCSqG
SIb3DQEBCw==
5.4.2. ASN.1 DUMP 输出
提供带有 4096 比特 RSA 密钥的 CSR, 并在签名中使用 SHA256 作为哈希算法.
<30 29>
0 41: SEQUENCE {
<06 09>
2 9: OBJECT IDENTIFIER challengePassword (1 2 840 113549 1 9 7)
: (PKCS #9)
<30 11>
13 17: SEQUENCE {
<06 09>
15 9: OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1)
: (PKCS #1)
<31 04>
26 4: SET {
<02 02>
28 2: INTEGER 4096
: }
: }
<06 09>
32 9: OBJECT IDENTIFIER sha256WithRSAEncryption
(1 2 840 113549 1 1 11)
: (PKCS #1)
: }
5.5. 要求特定曲线的公钥
CSR 要求使用特定曲线的 ECC 公钥.
5.5.1. Base64 编码示例
Base64:
MC4GCSqGSIb3DQEJBzASBgcqhkjOPQIBMQcGBSuBBAAiBgNV
BAUGCCqGSM49BAMD
5.5.2. ASN.1 DUMP 输出
提供带有 p384 ECC 公钥的 CSR, 包含序列号, 并在签名中使用 SHA384 作为
哈希算法.
<30 2E>
0 46: SEQUENCE {
<06 09>
2 9: OBJECT IDENTIFIER challengePassword (1 2 840 113549 1 9 7)
: (PKCS #9)
<30 12>
13 18: SEQUENCE {
<06 07>
15 7: OBJECT IDENTIFIER ecPublicKey (1 2 840 10045 2 1)
: (ANSI X9.62 public key type)
<31 07>
24 7: SET {
<06 05>
26 5: OBJECT IDENTIFIER secp384r1 (1 3 132 0 34)
: (SECG (Certicom) named elliptic curve)
: }
: }
<06 03>
33 3: OBJECT IDENTIFIER serialNumber (2 5 4 5)
: (X.520 DN component)
<06 08>
38 8: OBJECT IDENTIFIER ecdsaWithSHA384 (1 2 840 10045 4 3 3)
: (ANSI X9.62 ECDSA algorithm with SHA384)
: }
5.6. 要求特定扩展和属性
CSR 要求具有 ECC 公钥, 包含序列号, 包含 friendly name, 包含 favorite
drink [favoritedrink] [OID 0.9.2342.19200300.100.1.5], 并在签名中
使用 SHA512 作为哈希算法.
5.6.1. Base64 编码示例
Base64:
MEUGCSqGSIb3DQEJBzASBgcqhkjOPQIBMQcGBSuBBAAjBgkq
hkiG9w0BCRQGCgmSJomT8ixkAQUGA1UEBQYIKoZIzj0EAwQ=
5.6.2. ASN.1 DUMP 输出
提供带有 sha521 ECC 公钥的 CSR, 包含序列号, friendly name 和 favorite
drink, 并使用 SHA512 对其进行哈希.
<30 45>
0 69: SEQUENCE {
<06 09>
2 9: OBJECT IDENTIFIER challengePassword (1 2 840 113549 1 9 7)
: (PKCS #9)
<30 12>
13 18: SEQUENCE {
<06 07>
15 7: OBJECT IDENTIFIER ecPublicKey (1 2 840 10045 2 1)
: (ANSI X9.62 public key type)
<31 07>
24 7: SET {
<06 05>
26 5: OBJECT IDENTIFIER secp521r1 (1 3 132 0 35)
: (SECG (Certicom) named elliptic curve)
: }
: }
<06 09>
33 9: OBJECT IDENTIFIER friendlyName (for PKCS #12)
(1 2 840 113549 1 9 20)
: (PKCS #9 via PKCS #12)
<06 0A>
44 10: OBJECT IDENTIFIER '0 9 2342 19200300 100 1 5'
<06 03>
56 3: OBJECT IDENTIFIER serialNumber (2 5 4 5)
: (X.520 DN component)
<06 08>
61 8: OBJECT IDENTIFIER ecdsaWithSHA512 (1 2 840 10045 4 3 4)
: (ANSI X9.62 ECDSA algorithm with SHA512)
: }