Fehlermeldung
No supported key formats were found. Check that the input represents the contents of a PEM-encoded key file, not the path to such a file. (Parameter 'input')
Auch ausgegeben als
- An encrypted key was found, but no password was provided. Use ImportFromEncryptedPem to import this key. (Parameter 'input')
- Key is not a valid public or private key.
Ein Block `ENCRYPTED PRIVATE KEY` ergibt „An encrypted key was found, but no password was provided. Use ImportFromEncryptedPem to import this key.“
.NET System.Security.Cryptography — ArgumentException from AsymmetricAlgorithm.ImportFromPem
Was der Fehler bedeutet
`ImportFromPem` hat den String nach einem PEM-Block durchsucht, dessen Label es in dieses Algorithmusobjekt importieren kann, und keinen gefunden. Die Methode erwartet den PEM-Text, keinen Dateinamen, und ein Objekt vom Typ `ECDsa` akzeptiert nur EC-Labels (`PRIVATE KEY`, `EC PRIVATE KEY`, `PUBLIC KEY` mit einem EC-Schlüssel), ein Objekt vom Typ `RSA` nur RSA-Labels. Passt das Label, gehört der Schlüssel darin aber zu einem anderen Algorithmus, lautet der Fehler stattdessen „Key is not a valid public or private key.“
Warum der Fehler auftritt
Ein Dateipfad statt des Dateiinhalts
häufig`ImportFromPem("/keys/private.pem")` durchsucht den Pfad als String nach PEM-Rahmenzeilen und findet keine – der Hinweis in der Meldung ist genau für diesen Fehler gedacht.
Ein RSA-PEM in ECDsa importiert (oder umgekehrt)
häufigBlöcke `RSA PRIVATE KEY` / `RSA PUBLIC KEY` überspringt `ECDsa.ImportFromPem`, Blöcke `EC PRIVATE KEY` überspringt `RSA.ImportFromPem`.
Ein Zertifikat oder ein nicht unterstützter Block
gelegentlichBlöcke `CERTIFICATE`, `CERTIFICATE REQUEST` oder `OPENSSH PRIVATE KEY` sind keine Schlüsselformate, die `ImportFromPem` liest.
Der Schlüssel ist verschlüsselt
gelegentlichVerschlüsseltes PKCS#8 braucht `ImportFromEncryptedPem` mit dem Passwort.
So behebst du den Fehler
- 1.
Dateiinhalt an den richtigen Algorithmus übergeben
Lies die Datei, erzeuge das Objekt für den Algorithmus des Schlüssels und verwende für verschlüsselte Schlüssel die Variante für verschlüsselte Daten.
csharp using var ecdsa = ECDsa.Create(); ecdsa.ImportFromPem(File.ReadAllText("/run/secrets/jwt-signing-key.pem")); // contents, not the path // encrypted PKCS#8: ecdsa.ImportFromEncryptedPem(File.ReadAllText(path), Environment.GetEnvironmentVariable("KEY_PASSPHRASE")); - 2.
Zertifikate als Zertifikate laden
Nimm den öffentlichen Schlüssel aus einem `X509Certificate2`, statt das Zertifikats-PEM als Schlüssel zu importieren.
csharp // .NET 9+: certificates are loaded with X509CertificateLoader, then the key is taken from them var cert = X509CertificateLoader.LoadCertificate(File.ReadAllBytes("cert.der")); using ECDsa? publicKey = cert.GetECDsaPublicKey();