Mensagem de erro
x509: unsupported elliptic curve
Reproduzido no Go 1.26. Os parsers de chave privada relatam a mesma limitação com outras palavras: ParseECPrivateKey diz “x509: unknown elliptic curve”, e ParsePKCS8PrivateKey, “x509: failed to parse EC private key embedded in PKCS#8: x509: unknown elliptic curve”.
Go crypto/x509 — ParsePKIXPublicKey / ParseCertificate
O que significa
A chave ou o certificado passa na análise estrutural, mas o OID da curva não está entre os que a biblioteca padrão do Go aceita: o crypto/x509 trata apenas as curvas do NIST P-224, P-256, P-384 e P-521. Na prática, este erro quase sempre indica uma curva específica — a secp256k1, a curva do Bitcoin/Ethereum, que fica fora da stdlib de propósito: a equipe do Go entrega as curvas do NIST com implementações em tempo constante e deixa todo o resto para pacotes de terceiros.
Por que acontece
Material de chave secp256k1 nos parsers da stdlib
comumChaves geradas com openssl ecparam -name secp256k1 (ou exportadas de ferramentas de blockchain) trazem o OID 1.3.132.0.10. O pacote x509 do Go reconhece o OID como uma chave EC, mas não tem implementação dessa curva e para aqui.
Brainpool, GOST ou outras curvas nacionais
ocasionalCertificados Brainpool europeus e outras curvas que não são do NIST aparecem em alguns ecossistemas governamentais e bancários; a stdlib os trata exatamente como a secp256k1 — envelope analisável, curva sem suporte.
Curvas pequenas legadas
raraMaterial antigo em curvas da classe secp160/192 não tem suporte e, hoje, também é criptograficamente inadequado; a solução é a migração, não a análise.
Como corrigir
- 1.
Analisar material secp256k1 com uma biblioteca dedicada
Extraia você mesmo o ponto bruto (ou a partir da estrutura SEC1) e entregue-o a uma implementação de secp256k1 com manutenção ativa, como a do dcrd.
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.
Ou mover a carga de trabalho para a P-256
Se nada no sistema exigir secp256k1 (sem interoperabilidade com blockchain), gere as chaves de novo em uma curva aceita pela stdlib, e toda a cadeia de ferramentas fica mais simples.
bash openssl ecparam -name prime256v1 -genkey -noout -out key.pem openssl pkey -in key.pem -pubout -out pub.pem - 3.
Confirmar qual curva o material realmente usa
Antes de recorrer a uma biblioteca, leia o OID da curva no arquivo: 1.3.132.0.10 é secp256k1, 1.2.840.10045.3.1.7 é P-256. Isso também revela arquivos com rótulo errado, em que a curva não é a que o nome do arquivo ou a documentação afirma.
bash openssl ec -in key.pem -noout -text | grep -A1 "ASN1 OID" openssl x509 -in cert.pem -noout -text | grep -iA2 "public key algorithm"