Pular para o conteúdo
ecdsa.com
go-jose (Go)Go

Mensagem de erro

go-jose/go-jose: error in cryptographic primitive

Também aparece como

  • square/go-jose: error in cryptographic primitive

O go-jose v2 (importado como gopkg.in/square/go-jose.v2) usava o prefixo “square/go-jose:”; a v3 e a v4 usam “go-jose/go-jose:”. O mesmo erro é retornado em falhas de descriptografia de JWE.

go-jose (Go) — jose.ErrCryptoFailure from JSONWebSignature.Verify / jwt.JSONWebToken.Claims

O que significa

É a falha genérica de assinatura (ou de descriptografia) do go-jose, `jose.ErrCryptoFailure`. O JWS foi interpretado sem erros e o algoritmo era permitido, mas a verificação da assinatura com a chave que você passou falhou. O go-jose não diz mais nada de propósito — para um verificador, chave errada e token modificado parecem iguais — e, por isso, a investigação é sempre esta: qual chave você passou? O token foi alterado?

Por que acontece

Como corrigir

  1. 1.

    Selecionar a chave pelo kid e depois validar as claims

    Obtenha exatamente uma chave do JWKS do emissor pelo `kid` do cabeçalho, verifique o token e depois valide `iss`, `aud` e `exp` com `Claims.Validate` — o go-jose não verifica as claims por conta própria.

    go
    // keys: *jose.JSONWebKeySet fetched from the issuer's jwks_uri
    parsed, err := jwt.ParseSigned(raw, []jose.SignatureAlgorithm{jose.ES256})
    if err != nil {
    	return err
    }
    kid := parsed.Headers[0].KeyID
    matches := keys.Key(kid) // all keys with this kid
    if len(matches) != 1 {
    	return fmt.Errorf("no unique key for kid %q", kid)
    }
    var claims jwt.Claims
    if err := parsed.Claims(matches[0].Key, &claims); err != nil {
    	return err
    }
    return claims.Validate(jwt.Expected{Issuer: "https://issuer.example.com/", AnyAudience: jwt.Audience{"api"}, Time: time.Now()})

Erros relacionados

Ver toda a base de erros de assinatura