Pular para o conteúdo
ecdsa.com
Go crypto/x509Go

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

Como corrigir

  1. 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. 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. 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"

Erros relacionados

Ver toda a base de erros de assinatura