問題:秘密鍵の復号失敗
SSL/TLS証明書の管理では、秘密鍵の変換やロック解除が必要になることがよくあります。パスフレーズの解除、PEMからPKCS#12への変換、あるいは単に鍵の整合性チェックを行っているかもしれません。パスワードが正しいと確信して入力しても、OpenSSLが次のメッセージを表示して拒否することがあります。
error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
このエラーは最終的な検証ステップで発生します。OpenSSLはデータの処理には成功しましたが、生成された平文がパディングチェックに失敗しました。本質的には、間違ったパラメータで鍵が復号されたために計算が合わなくなったことを意味します。
分析:なぜ復号に失敗するのか
「bad decrypt」は通常、入力ミスを連想させますが、OpenSSLではより細かな技術的理由で失敗することがよくあります。
- シェルの文字エスケープ: パスワードに
$、!、#が含まれている場合、OpenSSLに届く前にターミナルがそれらの文字を削除したり変更したりしている可能性があります。 - 改行コードの破損: WindowsからLinuxに鍵を移動すると、
\r\n(キャリッジリターン)が混入することがよくあります。これらの隠し文字がBase64のパースを妨げることがあります。 - OpenSSL 3.0のレガシー機能の非推奨化: Ubuntu 22.04やmacOS Sonomaなどの最新OSではOpenSSL 3.xが使用されています。このバージョンでは、MD5ベースの鍵導出などの古い「安全でない」アルゴリズムがデフォルトで無効化されています。数年前に作成された鍵の場合、OpenSSL 3.xは特定のフラグなしでは復号を試行しません。
- ファイルの欠損: コピー&ペーストのミスなどでBase64ブロックの文字が1つでも欠けていると、パディングエラーが発生します。
ステップ別の解決策
1. ターミナルの干渉を排除する
シェルのエスケープ問題を避けるため、プロンプトに直接パスワードを入力するのはやめましょう。代わりに、一時ファイルを使用してパスフレーズを正確に渡します。
# 末尾に改行を追加しないようにprintfを使用する
printf "your_password_here" > pass.txt
# パスワードファイルを使用して鍵の読み取りを試行する
openssl rsa -in encrypted.key -passin file:pass.txt -text -noout
# ファイルを即座に削除する
rm pass.txt
printf は空白を正確に制御できるため、echo よりも安全です。パスワードの末尾にスペースが1つあるだけでも、06065064エラーの原因になります。
2. レガシープロバイダーを有効にする (OpenSSL 3.x)
最新のLinuxディストリビューションやmacOSを使用しており、パスワードが正しいと確信できる場合、原因はレガシーな暗号方式である可能性が高いです。古い鍵では pbeWithMD5AndDES-CBC がよく使われていますが、OpenSSL 3.xではセキュリティ上の理由からこれが無視されます。
以下のフラグを使用して、OpenSSLにレガシーモジュールを強制的にロードさせます。
# 古いRSA鍵をアンロックする
openssl rsa -in encrypted.key -out decrypted.key -legacy -provider default -provider legacy
.p12 または .pfx バンドルを扱う場合、コマンドは次のようになります。
openssl pkcs12 -in bundle.p12 -nodes -out certs.pem -legacy
3. Windowsの隠し文字を削除する
隠れた改行コード(CRLF)が原因であることも多いです。tr を使用してファイルをクリーンアップしてから、再度復号を試してください。
tr -d '\r' < encrypted.key > clean_encrypted.key
openssl rsa -in clean_encrypted.key -check
cat -A encrypted.key を実行することで、これらの文字が存在するか確認できます。行末に ^M が表示される場合、そのファイルはWindows形式の改行コードになっています。
恒久的な対策:暗号化方式を最新にする
-legacy フラグを使用しなければならなかった場合、その鍵はセキュリティ上の脆弱性となります。Nginx 1.24以降や新しいJava環境などの最新ツールでは、その鍵が拒否される可能性があります。すぐにAES-256暗号化にアップグレードすべきです。
まず、古い鍵を復号します。
openssl rsa -in old_key.key -out temp.key -legacy
次に、最新の標準を使用して再暗号化します。
openssl rsa -in temp.key -aes256 -out new_secure.key
これにより、本番環境の構成で特別なオーバーライドを必要とせずに、OpenSSL 3.xとの互換性が確保されます。
検証:鍵の整合性の確認
修正が完了したと思ったら、整合性チェックを実行してください。これにより、鍵の秘密部分と公開部分の数学的な関係が検証されます。
openssl rsa -in your_key.key -check -noout
"RSA key ok" と表示されれば完了です。ファイルが暗号化されていない場合、ヘッダーは -----BEGIN RSA PRIVATE KEY----- となり、テキスト内に Proc-Type や DEK-Info などの二次ヘッダーは含まれません。
エラーコードの解説
コンポーネント
説明
`06065064`
EVP復号失敗の数値ID。
`EVP_DecryptFinal_ex`
データが正常に復号されたかを確認する関数。
`bad decrypt`
パスワードまたはアルゴリズムがデータと一致しなかったことの確認。

