本文へスキップ
ecdsa.com
Python cryptographyPython の cryptography

エラーメッセージ

Password was not given but private key is encrypted

逆のケースもあります。「Password was given but private key is not encrypted.」は、同じ呼び出しで食い違いが逆になった場合です(どちらも cryptography 50.0 で再現を確認済み)。

Python cryptography — TypeError from load_pem_private_key

このエラーの意味

暗号化された秘密鍵に対して load_pem_private_key(data, password=None) を呼び出しています。その PEM には ENCRYPTED PRIVATE KEY と書かれているか、Proc-Type: 4,ENCRYPTED ヘッダーが付いているかのどちらかです。ライブラリは暗号化のエンベロープを認識できるので、推測はせずに処理を拒否します。必要なのは、バイト列で渡されたパスフレーズか、本当に暗号化されていない鍵です。

発生する理由

修正方法

  1. 1.

    パスフレーズをバイト列で渡す

    パスワードはシークレットストアから取得し、バイト列にエンコードして渡してください。念のため、空白は取り除いてください。

    python
    import os
    from cryptography.hazmat.primitives.serialization import load_pem_private_key
    
    password = os.environ["KEY_PASSPHRASE"].strip().encode()
    key = load_pem_private_key(pem_bytes, password=password)
  2. 2.

    または、プロビジョニング時に鍵を一度だけ復号する

    実行環境でパスフレーズを管理できない場合は、鍵を暗号化せずに適切なシークレットマネージャーに保存してください。パスワードが同じ env ファイルに置かれている暗号化された鍵は、何の保護にもなりません。また、パスフレーズが一度でも鍵と一緒にリポジトリに置かれていたことがあるなら、鍵をローテーションしてください。その時点で、暗号化は飾りにすぎなかったことになります。

    bash
    openssl pkey -in encrypted.pem -out plain.pem
    # (prompts once for the passphrase; protect plain.pem via the secret store)

関連するエラー

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