Aller au contenu
ecdsa.com
Python cryptographycryptography (Python)

Message d’erreur

Unable to load PEM file. See https://cryptography.io/en/latest/faq/#why-can-t-i-import-my-pem-file for more details. MalformedFraming

La phrase qui précède le jeton est fixe ; le jeton indique ce qui s’est mal passé. MalformedFraming signifie que les lignes BEGIN/END sont introuvables ; MismatchedTags("PRIVATE KEY", "PUBLIC KEY") signifie qu’elles ne concordent pas ; InvalidData(Invalid symbol 92, offset 0.) signifie que le corps n’est pas du base64 : 92 est une barre oblique inverse, signe de séquences \n littérales.

Python cryptography — ValueError from load_pem_* functions

Ce que cela signifie

load_pem_private_key / load_pem_public_key / load_pem_x509_certificate n’a pas trouvé d’encadrement PEM intact, c’est-à-dire des lignes BEGIN et END concordantes entourant un corps base64. Le jeton final (ici MalformedFraming) est le diagnostic de l’analyseur ; le lien vers la FAQ fait partie du texte même de l’erreur.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Normaliser avant le chargement

    Rétablissez les sauts de ligne, supprimez les espaces et les guillemets superflus, et vérifiez la première ligne avant de transmettre les octets au chargeur.

    python
    import os
    pem = os.environ["PRIVATE_KEY"].replace("\\n", "\n").strip().strip('"').encode()
    assert pem.startswith(b"-----BEGIN"), pem[:30]
    
    from cryptography.hazmat.primitives.serialization import load_pem_private_key
    key = load_pem_private_key(pem, password=None)
  2. 2.

    Privilégier les fichiers ou les secrets multilignes natifs

    Les fichiers de secrets montés évitent entièrement le problème d’échappement ; les Secrets Kubernetes et la plupart des coffres-forts de secrets peuvent fournir le PEM à l’octet près.

    python
    with open("/run/secrets/signing_key.pem", "rb") as f:
        key = load_pem_private_key(f.read(), password=None)
  3. 3.

    Valider mécaniquement l’encadrement

    Une vérification rapide de la présence et de la concordance des lignes BEGIN/END permet de déterminer si le défaut vient du contenu ou du transport.

    python
    lines = pem.decode().splitlines()
    print(lines[0])   # -----BEGIN PRIVATE KEY-----
    print(lines[-1])  # -----END PRIVATE KEY-----

Erreurs associées

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