Pular para o conteúdo
ecdsa.com
.NET System.Security.Cryptography.NET

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

Como corrigir

  1. 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. 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();

Erros relacionados

Ver toda a base de erros de assinatura