本文へスキップ
ecdsa.com
Node.js cryptoNode.js の crypto

エラーメッセージ

Failed to read asymmetric key

Node.js crypto — e.g. code ERR_OSSL_ASN1_WRONG_TAG

このエラーの意味

createPublicKey()(または crypto.verify() など、公開鍵を DER で受け取るあらゆる呼び出し)に渡されたバイト列の ASN.1 構造が、指定した type と一致しませんでした。たとえば type: "spki" を指定したのに、バイト列が実際には SEC1 の EC 秘密鍵だった場合です。OpenSSL はタグが誤っているとわかるところまで解析し、そこで停止しました。(createPrivateKey() やラベルの誤った PEM では、同じ種類の不一致が OpenSSL 自身の文言、たとえば「error:068000A8:asn1 encoding routines::wrong tag」で報告されます。)付随するコード(ERR_OSSL_ASN1_WRONG_TAG とその類似コード)は、ASN.1 レベルの不一致を示しています。解析できるものが何も見つからなかったことを意味する DECODER routines の「unsupported」エラーとは異なり、このエラーは、バイト列が指定した type とは別の構造だと識別できたことを意味します。

発生する理由

修正方法

  1. 1.

    構造を特定してから、正しく指定する

    asn1parse は外側の構造を出力します。SPKI は AlgorithmIdentifier を含む SEQUENCE で始まり、PKCS#8 はバージョンを表す INTEGER 0 で、SEC1 の EC 鍵は INTEGER 1 で始まります。

    bash
    openssl asn1parse -inform der -in key.der | head -5
  2. 2.

    Node のオプションをコンテナー形式に合わせる

    コンテナー形式がわかれば、あとは機械的に対応付けられます。

    js
    // SPKI public key
    createPublicKey({ key: der, format: "der", type: "spki" });
    // PKCS#8 private key
    createPrivateKey({ key: der, format: "der", type: "pkcs8" });
    // SEC1 (BEGIN EC PRIVATE KEY) private key
    createPrivateKey({ key: der, format: "der", type: "sec1" });
  3. 3.

    レガシーなコンテナー形式は入口で一度だけ変換する

    保存する形式を PKCS#8/SPKI に統一し、アプリケーションのコードが推測しなくて済むようにしてください。

    bash
    openssl pkey -in legacy-ec.pem -out key-pkcs8.pem            # any private → PKCS#8
    openssl pkey -in key-pkcs8.pem -pubout -out pub-spki.pem      # derive SPKI public

関連するエラー

署名エラーデータベースをすべて見る