Aller au contenu
ecdsa.com
Go encoding/asn1Go

Message d’erreur

asn1: structure error: tags don't match

Le message complet ajoute les tags attendu et trouvé ainsi que le contexte du champ, par exemple « tags don't match (16 vs {class:0 tag:2 ...}) ... AlgorithmIdentifier @2 ». Les entrées tronquées produisent l’erreur voisine « asn1: syntax error: data truncated ». Dans les versions actuelles de Go, le message provient des analyseurs de clés publiques et PKCS#8 ; x509.ParseCertificate signale les mêmes erreurs sous la forme « x509: malformed certificate ».

Go encoding/asn1 — surfaced through crypto/x509 parsers

Ce que cela signifie

Le décodeur DER de Go a trouvé un tag ASN.1 différent de celui qu’exige la structure cible : vous analysez du DER à peu près valide dans la mauvaise structure Go, ou quelque chose qui n’est pas du DER du tout. Les nombres du message sont des tags ASN.1 (16 = SEQUENCE, 2 = INTEGER, 13 dans un fichier PEM = le tiret par lequel il commence), qui permettent généralement d’identifier précisément la confusion.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Toujours commencer par pem.Decode

    Extrayez le bloc DER (et vérifiez son libellé) avant d’appeler un analyseur.

    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.

    Essayer les analyseurs de conteneurs dans l’ordre

    Quand le conteneur de la clé privée est inconnu, essayez PKCS#8, puis SEC1, puis PKCS#1 : c’est le tri habituel pour des clés de provenances diverses.

    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.

    Examiner les premiers octets

    Une seule ligne de hexdump vous indique si vous avez bien affaire à du DER, et openssl asn1parse montre la structure à comparer avec l’analyseur que vous avez choisi.

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

Erreurs associées

Parcourir toute la base de données des erreurs de signature