ま、そんなところで。

ニッチな技術系メモとか、車輪を再発明してみたりとか.

S/MIMEメールのsmime.p7mをOpenSSLで開く

S/MIMEの添付ファイルsmime.p7mが気になって仕方がない

S/MIMEってメール署名と暗号化ができて、仕事関係の内容をコソコソと関係者へメールするのにはもってこいなんだけど、OSに個人の秘密鍵と証明書インストールして対応メーラー準備しなきゃいけなかったりして、いろいろ面倒だったりします。

出張で自分のPCが触れない状況でGmailしていると、smime.p7mとかS/MIMEメールの添付ファイルが気になって仕方がないわけで・・。 自分の証明書と秘密鍵で何とか開けないものか・・・といろいろ調べてみたところ方法が見つかったのでメモ。

実は凄かったopensslのコマンド

opensslにはsmimeコマンドがあって、秘密鍵と証明書でファイルの暗号化/復号化ができるよ、と。

OpenSSLでファイルをS/MIMEで暗号化/復号化

# 暗号化(-outがなければ標準出力)
openssl smime -encrypt -in {暗号化したいファイル} \
                          [-out {暗号化出力ファイル名}] \
                          [-outform (smime or pem or der)] \
                          {受信者の証明書ファイル(PEM)}...
# 復号化(-outがなければ標準出力)
openssl smime -decrypt -in {暗号化ファイル} \
                          [-inform (smime or pem or der)] \
                          -inkey {受信者の秘密鍵ファイル(PEM形式)} \
                          [-out {復号したデータ出力先}]

同じように署名検証もできちゃいますよ、と。

OpenSSLでファイルをS/MIMEで署名/署名検証

# 署名(-outがなければ標準出力)
# -nocertsをつけると、署名に署名を行った証明書を含めません. 
# (サイズダウンできますが、検証時に秘密鍵だけで検証できなくなります. ちょっと不便.)
openssl smime -sign -in {署名するファイル}\
                          -signer {署名者の証明書ファイル(PEM形式)} \
                          -inkey {署名者の秘密鍵ファイル(PEM形式)} \
                          [-nocerts] \
                          [-out {署名したpkcs7形式データ}] \
                          [-outform (smime or pem or der)]
# 署名検証(-outがなければ標準出力)
# -recip もしくは -inkey いずれかを指定
# ただし、inkey指定での検証は、署名に署名者の証明書が付加されている場合のみ
# -noverifyは証明書のCA署名を確認しないオプション. 自己署名証明書の場合につけるとよいです.
openssl smime -verify -in {署名済みpkcs7形式データファイル} \
                          [-inform (smime or pem or der)] \
                          -recip {署名者の証明書ファイル(PEM形式)} \
                          [-noverify] \
                          [-out {元データ出力先}]
# 署名時に署名に使用した証明書が埋め込まれている場合はこちらでもOK.
openssl smime -verify -in {署名済みpkcs7形式データファイル} \
                          [-inform (smime or pem or der)] \
                          -inkey {受信者の秘密鍵ファイル(PEM形式)} \
                          [-noverify] \
                          [-out {元データ出力先}]

ちなみに、S/MIMEで署名/暗号化されたメールの添付ファイル smime.p7mDER形式 になっているようです.
入力ファイルの形式を正しく指定してやらないとうまく動かないので注意.

また、復元したメールの生データの文字コードiso-2022-jp (7bitのJIS)だったりするので、ヘッダの文字コード指定を見て文字コードをShift-JISとかUTF-8とかにうまくなおしてやれば良さげです.

これでp7mを覗く道筋が見えてきました!

暗号化メールの覗き方

まとめると、少なくとも手元に自分の秘密鍵さえあれば、以下のようにコマンドをパイプして元データを表示できますぜ!ってことです.

# 復号化→署名検証→文字コード変換
openssl smime -decrypt -in smime.p7m -inform der -inkey {自分の秘密鍵} | \  # 復号化
openssl smime -verify -inkey {自分の秘密鍵} -noverify | \ # 署名検証
iconv -f iso-2022-jp -t utf-8 # 文字コード変換

メッセージが「署名+暗号化」、「署名のみ」、「暗号化のみ」の各種ケースで行わなければならないコマンドが変化しますが、 基本的に復号→検証→文字コード変換の手順になるのは変わらないので、不要なステップはコマンドをSkipしてパイプでつなげればよさそうです.

添付ファイルを含むmultipartメールもうまい具合に復元できればいいんだけど・・ pythonとかでスクリプト組めば良さそうです.

そのうちやってみることにしよう.

(追記)

やってみた。
(続)S/MIMEメールのsmime.p7mをOpenSSLで開く(multipartの分離) - ま、そんなところで。


参考サイト