Mensagem de erro
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')
Também aparece 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.
Um bloco `ENCRYPTED PRIVATE KEY` gera “An encrypted key was found, but no password was provided. Use ImportFromEncryptedPem to import this key.”
.NET System.Security.Cryptography — ArgumentException from AsymmetricAlgorithm.ImportFromPem
O que significa
O `ImportFromPem` procurou na string um bloco PEM cujo rótulo ele consegue importar para este objeto de algoritmo e não encontrou nenhum. O método recebe o texto PEM, não um nome de arquivo, e um objeto `ECDsa` só aceita rótulos EC (`PRIVATE KEY`, `EC PRIVATE KEY`, `PUBLIC KEY` com uma chave EC), assim como um objeto `RSA` só aceita rótulos RSA. Quando o rótulo é compatível, mas a chave dentro dele pertence a outro algoritmo, o erro passa a ser “Key is not a valid public or private key.”
Por que acontece
Um caminho de arquivo em vez do conteúdo do arquivo
comum`ImportFromPem("/keys/private.pem")` procura delimitadores PEM na string do caminho e não encontra nenhum — a dica na mensagem existe justamente para esse engano.
Um PEM RSA importado em ECDsa (ou o contrário)
comumO `ECDsa.ImportFromPem` ignora blocos `RSA PRIVATE KEY` / `RSA PUBLIC KEY`, e o `RSA.ImportFromPem` ignora `EC PRIVATE KEY`.
Um certificado ou um bloco sem suporte
ocasionalBlocos `CERTIFICATE`, `CERTIFICATE REQUEST` ou `OPENSSH PRIVATE KEY` não são formatos de chave que o `ImportFromPem` lê.
A chave está criptografada
ocasionalUm PKCS#8 criptografado exige `ImportFromEncryptedPem` com a senha.
Como corrigir
- 1.
Passar o conteúdo do arquivo para o algoritmo certo
Leia o arquivo, crie o objeto do algoritmo da chave e, se a chave estiver criptografada, use a variante para PEM criptografado.
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.
Carregar certificados como certificados
Obtenha a chave pública de um `X509Certificate2` em vez de importar o PEM do certificado como chave.
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();