Mensaje de error
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')
También se muestra como
- 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 bloque `ENCRYPTED PRIVATE KEY` da «An encrypted key was found, but no password was provided. Use ImportFromEncryptedPem to import this key.»
.NET System.Security.Cryptography — ArgumentException from AsymmetricAlgorithm.ImportFromPem
Qué significa
`ImportFromPem` buscó en la cadena un bloque PEM cuya etiqueta pudiera importar en este objeto de algoritmo y no encontró ninguno. El método recibe el texto PEM, no un nombre de archivo, y un objeto `ECDsa` solo acepta etiquetas EC (`PRIVATE KEY`, `EC PRIVATE KEY`, `PUBLIC KEY` con una clave EC), y un objeto `RSA`, solo las de RSA. Si la etiqueta encaja pero la clave que contiene pertenece a otro algoritmo, el error es, en cambio, «Key is not a valid public or private key.»
Por qué ocurre
Una ruta de archivo en lugar del contenido del archivo
frecuente`ImportFromPem("/keys/private.pem")` busca delimitadores PEM en la cadena de la ruta y no encuentra ninguno: la indicación del mensaje está ahí precisamente para este error.
Un PEM RSA importado en ECDsa (o al revés)
frecuente`ECDsa.ImportFromPem` omite los bloques `RSA PRIVATE KEY` / `RSA PUBLIC KEY`, y `RSA.ImportFromPem`, los `EC PRIVATE KEY`.
Un certificado o un bloque no compatible
ocasionalLos bloques `CERTIFICATE`, `CERTIFICATE REQUEST` u `OPENSSH PRIVATE KEY` no son formatos de clave que lea `ImportFromPem`.
La clave está cifrada
ocasionalUn PKCS#8 cifrado necesita `ImportFromEncryptedPem` con la contraseña.
Cómo solucionarlo
- 1.
Pasar el contenido del archivo al algoritmo correcto
Lee el archivo, crea el objeto del algoritmo de la clave y, si la clave está cifrada, usa la variante para claves cifradas.
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.
Cargar los certificados como certificados
Obtén la clave pública de un `X509Certificate2` en lugar de importar el PEM del certificado como si fuera una clave.
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();