本文へスキップ
ecdsa.com
Go crypto/x509Go

エラーメッセージ

x509: unsupported elliptic curve

Go 1.26 で再現を確認しました。秘密鍵のパーサーは、同じ制限を別の言葉で報告します。ParseECPrivateKey は「x509: unknown elliptic curve」、ParsePKCS8PrivateKey は「x509: failed to parse EC private key embedded in PKCS#8: x509: unknown elliptic curve」と出力します。

Go crypto/x509 — ParsePKIXPublicKey / ParseCertificate

このエラーの意味

鍵や証明書は構造としては解析できますが、その曲線の OID は Go の標準ライブラリが対応していないものです。crypto/x509 が扱うのは NIST 曲線の P-224、P-256、P-384、P-521 だけです。実際には、このエラーはほぼ必ず特定の 1 つの曲線、つまり Bitcoin や Ethereum の曲線である secp256k1 を意味します。この曲線は意図的に標準ライブラリの対象外になっています。Go チームは NIST 曲線を定数時間の実装で提供し、それ以外はすべてサードパーティのパッケージに任せています。

発生する理由

修正方法

  1. 1.

    専用のライブラリで secp256k1 を解析する

    生の点を自前で(または SEC1 構造から)取り出し、dcrd のものなど、メンテナンスされている secp256k1 の実装に渡してください。

    go
    import (
        "github.com/decred/dcrd/dcrec/secp256k1/v4"
        "github.com/decred/dcrd/dcrec/secp256k1/v4/ecdsa"
    )
    
    pub, err := secp256k1.ParsePubKey(pointBytes)  // 33/65-byte SEC1 point
    ok := ecdsa.VerifySignature(...)               // via the package's ecdsa subpackage
  2. 2.

    または、ワークロードを P-256 に移行する

    システム内に secp256k1 を必要とするものがない(ブロックチェーンとの相互運用がない)場合は、標準ライブラリが対応する曲線で鍵を再生成してください。ツールチェーン全体がシンプルになります。

    bash
    openssl ecparam -name prime256v1 -genkey -noout -out key.pem
    openssl pkey -in key.pem -pubout -out pub.pem
  3. 3.

    鍵素材が実際に使っている曲線を確認する

    ライブラリを導入する前に、ファイルから曲線の OID を読み取ってください。1.3.132.0.10 は secp256k1、1.2.840.10045.3.1.7 は P-256 です。こうすると、ファイル名やドキュメントの記載と実際の曲線が異なる、ラベルの誤ったファイルも見つけられます。

    bash
    openssl ec -in key.pem -noout -text | grep -A1 "ASN1 OID"
    openssl x509 -in cert.pem -noout -text | grep -iA2 "public key algorithm"

関連するエラー

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