Message d’erreur
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')
Également affiché sous la forme
- 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.
Un bloc `ENCRYPTED PRIVATE KEY` donne « An encrypted key was found, but no password was provided. Use ImportFromEncryptedPem to import this key. »
.NET System.Security.Cryptography — ArgumentException from AsymmetricAlgorithm.ImportFromPem
Ce que cela signifie
`ImportFromPem` a parcouru la chaîne à la recherche d’un bloc PEM dont l’étiquette peut être importée dans cet objet d’algorithme, et n’en a trouvé aucun. La méthode prend le texte PEM, et non un nom de fichier, et un objet `ECDsa` n’accepte que les étiquettes EC (`PRIVATE KEY`, `EC PRIVATE KEY`, `PUBLIC KEY` avec une clé EC), un objet `RSA` que les étiquettes RSA. Lorsque l’étiquette convient mais que la clé qu’elle contient relève d’un autre algorithme, l’erreur est plutôt « Key is not a valid public or private key. »
Pourquoi cela se produit
Un chemin de fichier au lieu du contenu du fichier
fréquente`ImportFromPem("/keys/private.pem")` cherche une armure PEM dans la chaîne du chemin et n’en trouve aucune : l’indication donnée dans le message est là précisément pour cette erreur.
Un PEM RSA importé dans ECDsa (ou l’inverse)
fréquenteLes blocs `RSA PRIVATE KEY` / `RSA PUBLIC KEY` sont ignorés par `ECDsa.ImportFromPem`, et `EC PRIVATE KEY` par `RSA.ImportFromPem`.
Un certificat ou un bloc non pris en charge
occasionnelleLes blocs `CERTIFICATE`, `CERTIFICATE REQUEST` ou `OPENSSH PRIVATE KEY` ne sont pas des formats de clé que lit `ImportFromPem`.
La clé est chiffrée
occasionnelleUne clé PKCS#8 chiffrée exige `ImportFromEncryptedPem` avec le mot de passe.
Comment corriger l’erreur
- 1.
Passer le contenu du fichier au bon algorithme
Lisez le fichier, créez l’objet correspondant à l’algorithme de la clé et utilisez la variante pour clés chiffrées lorsque la clé est chiffrée.
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.
Charger les certificats en tant que certificats
Prenez la clé publique depuis un `X509Certificate2` au lieu d’importer le PEM du certificat comme une clé.
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();