エラーメッセージ
SyntaxError: Cannot create a key using the specified key usages.
別の表記
- SyntaxError: Usages cannot be empty when creating a key.
- SyntaxError: An invalid or illegal string was specified
- SyntaxError: A required parameter was missing or out-of-range
Chromium は「Cannot create a key using the specified key usages.」または「Usages cannot be empty when creating a key.」、Firefox は「An invalid or illegal string was specified」、Safari/WebKit は「A required parameter was missing or out-of-range」です。判定には `e.name === "SyntaxError"` を使ってください。
WebCrypto SubtleCrypto.importKey / generateKey — DOMException SyntaxError (Chromium / Firefox / WebKit)
このエラーの意味
`keyUsages` 配列が、作成しようとしている鍵に合っていません。WebCrypto は、鍵の種類ごとに持てる用途を定めています。ECDSA または RSA の公開鍵に許されるのは `verify` だけ、秘密鍵は `sign` だけです。ECDH の公開鍵は用途を持ちません。また、空の用途リストで秘密鍵や共通鍵を作成することはできません。ブラウザーは鍵が作られる前に、`SyntaxError` の DOMException で呼び出しを拒否します。これは、既存の鍵を作成時の目的とは違う操作に使ったときに後から発生する `InvalidAccessError` とは異なります。
発生する理由
公開鍵を sign 用途で(または秘密鍵を verify 用途で)インポートしている
よくある同じ `["sign", "verify"]` 配列をすべての `importKey` 呼び出しにコピーすると、単体の鍵では失敗します。リストを鍵ペアの 2 つの鍵に振り分けるのは `generateKey` だけです。
用途リストが空
よくある`generateKey(alg, true, [])`、または `[]` での秘密鍵のインポートです。鍵は少なくとも 1 つの用途のために作成しなければなりません。
ECDH と ECDSA の混同
ときどき`["sign"]` を指定した ECDH の鍵や、`["deriveBits"]` を指定した ECDSA の鍵のインポートは失敗します。同じ曲線上の点でも、アルゴリズムごとに別の種類の鍵になるからです。
修正方法
- 1.
各鍵にその役割に応じた用途を与える
公開鍵は `verify`(署名)または `[]`(ECDH の相手側の鍵)、秘密鍵は `sign` または `deriveBits`/`deriveKey` です。用途は最小限にしてください。用途は WebCrypto の最小権限モデルの一部です。
js const alg = { name: "ECDSA", namedCurve: "P-256" }; // Public keys verify, private keys sign: const publicKey = await crypto.subtle.importKey("spki", spkiDer, alg, false, ["verify"]); const privateKey = await crypto.subtle.importKey("pkcs8", pkcs8Der, alg, false, ["sign"]); // ECDH keys derive; their public half takes no usages at all: const peer = await crypto.subtle.importKey("raw", point, { name: "ECDH", namedCurve: "P-256" }, false, []);
関連するエラー
InvalidAccessError: Unable to use this key to verifyWebCrypto crypto.subtle.sign / verifyDataError: Data provided to an operation does not meet requirementsWebCrypto crypto.subtle.importKeyInvalidAccessError: Failed to execute 'exportKey' on 'SubtleCrypto': key is not…WebCrypto SubtleCrypto.exportKey / wrapKey