Zum Inhalt springen
ecdsa.com
Python cryptographyPython cryptography

Fehlermeldung

Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).

Auch ausgegeben als

  • ValueError: Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters). Details: ASN.1 parsing error: short data (needed at least 48 additional bytes)
  • Could not deserialize key data. The data may be in an incorrect format, the provided password may be incorrect, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).
  • ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).', [<OpenSSLError(code=503841036, lib=60, reason=524556, reason_text=unsupported)>

Über mehrere Releases geprüft: Ab cryptography 45.0 wird „Details: …“ angehängt (zum Beispiel „ASN.1 parsing error: short data“). Die Versionen 43–44 liefern den Text als Tupel mit OpenSSL-Fehlerobjekten und ergänzen den Satz um „the provided password may be incorrect“ (und verwenden diese Meldung auch bei falschen Passwörtern); 36–42 liefern die Tupelform ohne diesen Zusatz.

Python cryptography — ValueError from load_pem_private_key / load_der_private_key / load_der_public_key

Was der Fehler bedeutet

cryptography hat Schlüsseldaten gefunden, aus denen es kein Schlüsselobjekt erzeugen konnte. Bei PEM-Eingaben waren die BEGIN- und END-Zeilen in Ordnung (sonst würdest du „Unable to load PEM file“ sehen), das Problem liegt also im darin enthaltenen DER: Es ist abgeschnitten, hat eine andere Struktur, als der Loader erwartet, oder beschreibt einen Schlüssel, den cryptography nicht laden will – EC-Schlüssel mit expliziten Kurvenparametern oder Schlüssel, die mit einem Algorithmus verschlüsselt sind, den es nicht unterstützt. Neuere Versionen hängen „Details: …“ mit dem Low-Level-Grund aus dem ASN.1-Parser an.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Schlüssel zuerst mit OpenSSL prüfen

    Scheitert schon `openssl asn1parse`, ist die Datei beschädigt – besorge dir eine neue Kopie. Lädt OpenSSL sie, cryptography aber nicht, sieh dir die Kodierung der Kurve oder den Verschlüsselungsalgorithmus an.

    bash
    openssl asn1parse -in key.pem | head -20     # does the DER parse at all?
    openssl pkey -in key.pem -noout -text | head  # private key: type, curve, size
    openssl pkey -pubin -in pub.pem -noout -text   # public key
  2. 2.

    Passenden Loader für den Schlüssel verwenden

    Wähle anhand der Daten selbst zwischen den Loadern für PEM, DER und OpenSSH, und verwende für öffentliche Schlüssel die Public-Key-Loader.

    python
    from cryptography.hazmat.primitives import serialization
    
    def load_any_private_key(data: bytes, password: bytes | None = None):
        if data.lstrip().startswith(b"-----BEGIN OPENSSH PRIVATE KEY-----"):
            return serialization.load_ssh_private_key(data, password)
        if data.lstrip().startswith(b"-----BEGIN"):
            return serialization.load_pem_private_key(data, password)
        return serialization.load_der_private_key(data, password)
  3. 3.

    Explizite Parameter in eine benannte Kurve umwandeln

    OpenSSL 3 schreibt EC-Schlüssel standardmäßig mit benannten Kurven, daher behebt ein einmaliger Neuexport des Schlüssels das Problem mit expliziten Parametern für jede Bibliothek.

    bash
    # Re-encode an EC key with a named curve instead of explicit parameters
    openssl pkey -in explicit.pem -out named.pem
    openssl ec -in named.pem -param_out -noout -text | grep "ASN1 OID"   # e.g. prime256v1

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen