本文へスキップ
ecdsa.com
.NET System.Security.Cryptography.NET

エラーメッセージ

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')

別の表記

  • 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.

`ENCRYPTED PRIVATE KEY` ブロックの場合は「An encrypted key was found, but no password was provided. Use ImportFromEncryptedPem to import this key.」になります。

.NET System.Security.Cryptography — ArgumentException from AsymmetricAlgorithm.ImportFromPem

このエラーの意味

`ImportFromPem` は、このアルゴリズムのオブジェクトにインポートできるラベルを持つ PEM ブロックを文字列内で探しましたが、見つかりませんでした。このメソッドが受け取るのはファイル名ではなく PEM のテキストです。また、`ECDsa` オブジェクトは EC のラベル(`PRIVATE KEY`、`EC PRIVATE KEY`、EC 鍵を含む `PUBLIC KEY`)だけを、`RSA` オブジェクトは RSA のラベルだけを受け付けます。ラベルは合っていても中の鍵が別のアルゴリズムのものである場合は、代わりに「Key is not a valid public or private key.」というエラーになります。

発生する理由

修正方法

  1. 1.

    ファイルの内容を正しいアルゴリズムに渡す

    ファイルを読み込み、鍵のアルゴリズムに対応するオブジェクトを作成してください。暗号化された鍵には、暗号化鍵用のメソッドを使ってください。

    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.

    証明書は証明書として読み込む

    証明書の PEM を鍵としてインポートするのではなく、`X509Certificate2` から公開鍵を取り出してください。

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

関連するエラー

署名エラーデータベースをすべて見る