エラーメッセージ
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 曲線を定数時間の実装で提供し、それ以外はすべてサードパーティのパッケージに任せています。
発生する理由
標準ライブラリのパーサーに渡された secp256k1 の鍵素材
よくあるopenssl ecparam -name secp256k1 で生成した鍵(またはブロックチェーン用のツールからエクスポートした鍵)には、OID 1.3.132.0.10 が含まれています。Go の x509 パッケージは、この OID を EC 鍵として認識しますが、対応する曲線の実装を持たないため、ここで処理を止めます。
Brainpool、GOST、その他の国家規格の曲線
ときどき欧州の Brainpool 曲線を使う証明書や、NIST 以外のその他の曲線は、一部の政府機関や銀行のシステムで使われています。標準ライブラリはこれらを secp256k1 とまったく同じように扱います。外側の構造は解析できても、曲線には対応していません。
鍵長の短い旧式の曲線
まれsecp160/192 クラスの曲線を使う古い鍵素材は、対応していないうえに、現在では暗号強度も不十分です。必要なのは解析ではなく移行です。
修正方法
- 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.
または、ワークロードを P-256 に移行する
システム内に secp256k1 を必要とするものがない(ブロックチェーンとの相互運用がない)場合は、標準ライブラリが対応する曲線で鍵を再生成してください。ツールチェーン全体がシンプルになります。
bash openssl ecparam -name prime256v1 -genkey -noout -out key.pem openssl pkey -in key.pem -pubout -out pub.pem - 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"