2017-08-24 118 views
1

我想如下導入一個ECDSA公共密鑰:crypto.subtle.importKey在Chrome中拋出一個拋出:DOMException,而Firefox行之有效

ua8 = new Uint8Array([48, 86, 48, 16, 6, 4, 43, 129, 4, 112, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7, 3, 66, 0, 4, 124, 78, 186, 4, 136, 215, 226, 113, 200, 80, 93, 199, 105, 63, 47, 60, 193, 162, 180, 226, 160, 164, 9, 183, 122, 42, 97, 201, 99, 128, 54, 227, 193, 220, 229, 75, 186, 223, 201, 227, 229, 159, 159, 67, 205, 3, 126, 74, 211, 202, 122, 66, 185, 150, 74, 152, 192, 177, 81, 155, 106, 237, 212, 146]); 
crypto.subtle.importKey("spki", ua8, { name: "ECDSA", namedCurve: "P-256", }, false, ["verify"]); 

在Firefox中,這個效果很好,但在Chrome中我得到DOMException。

我希望它能夠在這兩種瀏覽器中工作。我該如何解決它?

+0

感謝您編輯文本。我不是一個好英文作家。它的工作原理是 – saintthor

回答

1

根據the Chromium WebCrypto documentation

Chromium的WebCrypto實現支持所有的主要格式 - 「生」, 「SPKI」, 「PKCS8」, 「JWK」,有以下注意事項:

  • Web Crypto實現之間的DER密鑰格式處理存在差異。在可能的情況下,爲了兼容性,更喜歡使用具有更好互操作性的「原始」密鑰或「jwk」。

  • 導入/導出「spki」和「pkcs8」格式時,由Chromiumare支持的唯一OID由OpenSSL/BoringSSL識別。

特別

,它說:

  • 導入ECDH鍵does not accept id-ecDH。該OID反而應該ID-ecPublicKey(這可能會導致進口Firefox瀏覽器生成的密鑰問題;用「原始」 EC鍵作爲一種變通方法,鉻在這種情況下不遵循規範)

(該bug跟蹤鏈接是給我一個500內部服務器錯誤,但是這可能是暫時的)

Looking at your key in an ASN.1 decoder,它包含以下數據:

SEQUENCE (2 elem) 
    SEQUENCE (2 elem) 
     OBJECT IDENTIFIER 1.3.132.112 
     OBJECT IDENTIFIER 1.2.840.10045.3.1.7 prime256v1 (ANSI X9.62 named elliptic curve) 
    BIT STRING (520 bit) 0000010001111100010011101011101000000100100010001101011111100010011100… 

對象標識符1.3.132.112是恰恰是Chrome無法識別的「id-ecDH」標識符。對於它的價值,a key exported from Chrome改爲具有OID 1.2.840.10045.2.1(「ecPublicKey」)。

正如鏈接文檔頁面所示,作爲解決方法,您可能希望從「spki」格式切換到「原始」格式(或"jwk",這是基於JSON的格式)。

+0

。謝謝。 – saintthor

相關問題