Saltar al contenido
ecdsa.com
Go encoding/asn1Go

Mensaje de error

asn1: structure error: tags don't match

El mensaje completo añade las etiquetas esperada y encontrada, más el contexto del campo, por ejemplo «tags don't match (16 vs {class:0 tag:2 ...}) ... AlgorithmIdentifier @2». Las entradas truncadas producen el error hermano «asn1: syntax error: data truncated». En las versiones actuales de Go, el mensaje procede de los analizadores de claves públicas y de PKCS#8; x509.ParseCertificate notifica los mismos errores como «x509: malformed certificate».

Go encoding/asn1 — surfaced through crypto/x509 parsers

Qué significa

El decodificador DER de Go encontró una etiqueta ASN.1 distinta de la que requiere la estructura de destino: estás analizando DER más o menos válido con la estructura de Go equivocada, o analizando algo que ni siquiera es DER. Los números del mensaje son etiquetas ASN.1 (16 = SEQUENCE, 2 = INTEGER, 13 en un archivo PEM = el guion con el que empieza), y suelen identificar la confusión con precisión.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Aplicar siempre pem.Decode primero

    Extrae el bloque DER (y comprueba su etiqueta) antes de llamar a cualquier analizador.

    go
    block, _ := pem.Decode(pemBytes)
    if block == nil {
        return fmt.Errorf("input is not PEM")
    }
    cert, err := x509.ParseCertificate(block.Bytes)   // block.Type == "CERTIFICATE"
  2. 2.

    Probar los analizadores de contenedores en orden

    Si no conoces el contenedor de la clave privada, prueba PKCS#8, después SEC1 y después PKCS#1: es el procedimiento estándar para claves de orígenes diversos.

    go
    if k, err := x509.ParsePKCS8PrivateKey(der); err == nil { return k, nil }
    if k, err := x509.ParseECPrivateKey(der); err == nil { return k, nil }
    if k, err := x509.ParsePKCS1PrivateKey(der); err == nil { return k, nil }
    return nil, errors.New("unrecognized private key format")
  3. 3.

    Mirar los primeros bytes

    Una línea de volcado hexadecimal te dice si al menos tienes DER, y openssl asn1parse muestra la estructura que debe coincidir con el analizador elegido.

    bash
    head -c 16 key.der | xxd          # 30 81/82 ... → SEQUENCE, plausibly DER
    openssl asn1parse -inform der -in key.der | head -3

Errores relacionados

Explorar toda la base de datos de errores de firma