Firefox 的 EC public 密钥的 spki 导出中这个奇怪的 ObjectID 是什么?
What is this weird ObjectID in Firefox's spki export of an EC public key?
鉴于 EC public 密钥的 spki 导出(代码在底部),Chromium & co 给出了一个正常的 ObjectID,但 Firefox 给出了一个完全不同的:
0 86: SEQUENCE {
2 16: SEQUENCE {
4 4: OBJECT IDENTIFIER '1 3 132 112'wat
10 8: OBJECT IDENTIFIER prime256v1 (1 2 840 10045 3 1 7)
: }
20 66: BIT STRING
: 04 EB F3 46 9A 56 19 D6 76 36 23 3B 57 D4 01 25
: CD DD A4 BF 72 DF 51 C7 E7 AA 81 B9 04 5F DF 6B
: CA 02 E4 3E 02 D1 44 57 65 EB 9E 36 C4 79 A6 F8
: 51 BB 2D 8F DC C4 42 B3 DB 8B A3 AF 57 F0 BF 7B
: 35
: }
作为参考,这是从 Chromium 中提取的:
0 89: SEQUENCE {
2 19: SEQUENCE {
4 7: OBJECT IDENTIFIER ecPublicKey (1 2 840 10045 2 1)yes thank you
13 8: OBJECT IDENTIFIER prime256v1 (1 2 840 10045 3 1 7)
: }
23 66: BIT STRING
: 04 9D 16 97 2F 89 6F 9B 87 4B 86 0E F7 8F BB 98
: 37 E2 BF 75 7C 8E AD 1C A7 B4 5F 6D 75 72 90 FC
: 8F 30 AF 91 4B AA 96 71 F3 52 6B 58 8F E0 27 92
: 13 12 77 D1 17 76 F3 3A FD ED A9 B1 1A 64 5E 5F
: B1
: }
(使用 dumpasn1
生成的转储)
事实上,继续 OID ref Chromium 的标识符似乎不错。
Firefox 的 OID 似乎属于 another group entirely,我什至找不到它。
问题是,不同的 OID 会导致各种导入崩溃。以这种方式从 Firefox 导出的密钥在不先进行更改的情况下无法导入到 OpenSSL 甚至 Chromium 中。
因此,
- 这个 ID 是什么?
- 为什么 Firefox 使用它而不是 Chromium 使用的更多 "standard" 一个?
- 说到标准,W3C Recommandation 或相关 RFC 中是否定义了这种导出格式?
这里有一个片段可以快速生成导出的 EC public 密钥:
(async () => {
const subtle = crypto.subtle
const eckp = await subtle.generateKey({
name: 'ECDSA',
namedCurve: 'P-256'
}, true, ['sign', 'verify'])
const exportedPubK = new Uint8Array(await subtle.exportKey('spki', eckp.publicKey))
console.log(exportedPubK.length) // 88 for the weird OID, 91 otherwise.
console.log(`[${exportedPubK.join(', ')}]`)
})();
重要提示
这个问题在 this Firefox bug 的解决和关闭时已经过时了。 Firefox 72 应该不会再显示这个问题。
原因是 Firefox 错误,请分别参见 Bug 1410403 and Bug 1514032。
根据 RFC 5480, section 2.1.1. OID 1.3.132.112
is not defined (the similar OID 1.3.132.1.12
is restricted to ECDH, see also RFC 5480, section 2.1.2 and W3C Recommendation, section B).
,public ECDSA(或 ECDH)密钥的正确 OID 是 1.2.840.10045.2.1
鉴于 EC public 密钥的 spki 导出(代码在底部),Chromium & co 给出了一个正常的 ObjectID,但 Firefox 给出了一个完全不同的:
0 86: SEQUENCE { 2 16: SEQUENCE { 4 4: OBJECT IDENTIFIER '1 3 132 112'wat 10 8: OBJECT IDENTIFIER prime256v1 (1 2 840 10045 3 1 7) : } 20 66: BIT STRING : 04 EB F3 46 9A 56 19 D6 76 36 23 3B 57 D4 01 25 : CD DD A4 BF 72 DF 51 C7 E7 AA 81 B9 04 5F DF 6B : CA 02 E4 3E 02 D1 44 57 65 EB 9E 36 C4 79 A6 F8 : 51 BB 2D 8F DC C4 42 B3 DB 8B A3 AF 57 F0 BF 7B : 35 : }
作为参考,这是从 Chromium 中提取的:
0 89: SEQUENCE { 2 19: SEQUENCE { 4 7: OBJECT IDENTIFIER ecPublicKey (1 2 840 10045 2 1)yes thank you 13 8: OBJECT IDENTIFIER prime256v1 (1 2 840 10045 3 1 7) : } 23 66: BIT STRING : 04 9D 16 97 2F 89 6F 9B 87 4B 86 0E F7 8F BB 98 : 37 E2 BF 75 7C 8E AD 1C A7 B4 5F 6D 75 72 90 FC : 8F 30 AF 91 4B AA 96 71 F3 52 6B 58 8F E0 27 92 : 13 12 77 D1 17 76 F3 3A FD ED A9 B1 1A 64 5E 5F : B1 : }
(使用 dumpasn1
生成的转储)
事实上,继续 OID ref Chromium 的标识符似乎不错。
Firefox 的 OID 似乎属于 another group entirely,我什至找不到它。
问题是,不同的 OID 会导致各种导入崩溃。以这种方式从 Firefox 导出的密钥在不先进行更改的情况下无法导入到 OpenSSL 甚至 Chromium 中。
因此,
- 这个 ID 是什么?
- 为什么 Firefox 使用它而不是 Chromium 使用的更多 "standard" 一个?
- 说到标准,W3C Recommandation 或相关 RFC 中是否定义了这种导出格式?
这里有一个片段可以快速生成导出的 EC public 密钥:
(async () => {
const subtle = crypto.subtle
const eckp = await subtle.generateKey({
name: 'ECDSA',
namedCurve: 'P-256'
}, true, ['sign', 'verify'])
const exportedPubK = new Uint8Array(await subtle.exportKey('spki', eckp.publicKey))
console.log(exportedPubK.length) // 88 for the weird OID, 91 otherwise.
console.log(`[${exportedPubK.join(', ')}]`)
})();
重要提示
这个问题在 this Firefox bug 的解决和关闭时已经过时了。 Firefox 72 应该不会再显示这个问题。
原因是 Firefox 错误,请分别参见 Bug 1410403 and Bug 1514032。
根据 RFC 5480, section 2.1.1. OID 1.3.132.112
is not defined (the similar OID 1.3.132.1.12
is restricted to ECDH, see also RFC 5480, section 2.1.2 and W3C Recommendation, section B).
1.2.840.10045.2.1