Zum Inhalt springen
ecdsa.com
Python cryptographyPython cryptography

Fehlermeldung

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

Der Satz vor dem Token ist fest; das Token benennt, was schiefgelaufen ist. MalformedFraming bedeutet, dass die BEGIN/END-Zeilen nicht gefunden wurden; MismatchedTags("PRIVATE KEY", "PUBLIC KEY") bedeutet, dass sie nicht zueinander passen; InvalidData(Invalid symbol 92, offset 0.) bedeutet, dass der Inhalt kein base64 ist – 92 ist ein Backslash, das Kennzeichen wörtlicher Zeichenfolgen \n.

Python cryptography — ValueError from load_pem_* functions

Was der Fehler bedeutet

load_pem_private_key / load_pem_public_key / load_pem_x509_certificate haben keinen intakten PEM-Rahmen gefunden – zueinander passende BEGIN- und END-Zeilen mit base64-Inhalt dazwischen. Das Token am Ende (hier MalformedFraming) ist die Diagnose des Parsers; der FAQ-Link steht direkt im Fehlertext.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Vor dem Laden normalisieren

    Stelle die Zeilenumbrüche wieder her, entferne Whitespace und Anführungszeichen und prüfe die erste Zeile, bevor du die Bytes an die Ladefunktion übergibst.

    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.

    Dateien oder native mehrzeilige Secrets bevorzugen

    Eingebundene Secret-Dateien vermeiden das Problem mit der Maskierung vollständig; Kubernetes-Secrets und die meisten Vaults können das PEM bytegenau liefern.

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

    Rahmen automatisiert prüfen

    Eine schnelle Prüfung, ob die BEGIN/END-Zeilen vorhanden sind und zueinander passen, grenzt den Fehler ein: Inhalt oder Übertragung.

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

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen