OpenSSLのdgstにMsgを渡す方法雑まとめ
Pythonのcommunicate() をシェルスクリプトへ置き換える
Python の subprocess.Popen(...).communicate() を使って、
OpenSSL dgst コマンドへメッセージ(Msg)を標準入力で渡していた処理をシェルスクリプト(.sh)でどう置き換えるか?
📚 目次
- 結論:3つの方法で置き換え可能
- 1. パイプで標準入力を渡す(最も簡単 & communicate() と等価)
- 2. 署名(-sign)でも同様にパイプで Msg を渡す
- 3. 一時ファイルを使う方法(ログや再現性を重視する場合)
- 方法比較表
- まとめ
📌 結論:3つの方法で置き換え可能
Python の communicate() をシェルに置き換えるとき、Msg の渡し方はこの3種類です:
- パイプで標準入力に流し込む(最も一般的)
- 署名(-sign)でも同じようにパイプで OK
- Msg を一時ファイルに書いて渡す(再現性が高い)
1. パイプで標準入力を渡す(最も簡単 & communicate() と等価)
Python の communicate() で入力していた内容を、そのまま echo → パイプ → openssl に置き換えます。
echo -n "$MSG" | openssl dgst -sha256
-n は末尾に改行を入れないために付けます。
Python でのやり方は以下
p = subprocess.Popen(["openssl", "dgst", "-sha256"],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
out = p.communicate(b"Hello")[0]
シェルだとこう
echo -n "Hello" | openssl dgst -sha256
動作は完全に同じです。
2. 署名(-sign)でも同様にパイプで Msg を渡す
RSA や ECDSA 署名などで秘密鍵を使う場合でも、
Python → Shell の置き換えは同じくパイプ方式でできます。
echo -n "$MSG" | openssl dgst -sha256 -sign private.key -out sig.bin
OpenSSL は標準入力を素直に受け取ってくれるので、
communicate() の置き換えは自然に動作します。
3. 一時ファイルを使う方法(ログや再現性を重視する場合)
大量処理やバッチ処理の場合、Msg をファイルに保存して渡すのが便利です。
echo -n "$MSG" > message.txt
openssl dgst -sha256 message.txt
署名する場合:
openssl dgst -sha256 -sign private.key -out sig.bin message.txt
ログを残したい場合はこの方法がベストです。
📊 方法比較表
| 方法 | 特徴 | 再現性 | Python communicate() との近さ |
|---|---|---|---|
| ① パイプ入力(echo openssl) | 最も簡単で直感的 | △ | ⭐⭐⭐⭐⭐ |
| ② 署名でもパイプでOK | 通常の Msg と同じ操作 | △ | ⭐⭐⭐⭐⭐ |
| ③ 一時ファイルに書く | ログ管理・デバッグ向け | ◎ | ⭐⭐⭐⭐ |
🧭 まとめ
Python の communicate() で行っていた入力処理は、
シェルスクリプトでは次の 1 行で置き換え可能です:
echo -n "$MSG" | openssl dgst -sha256
署名でも同じ要領で使えるため、
OpenSSL を使ったスクリプト処理を Python から Shell に移行する際にとても便利。