S/MIMEで暗号化


AさんからBさんへ暗号化メールを送る場合の流れを調べてみる。双方ともオレオレ証明書で運用する。

Aさんが以下を実行して、鍵と証明書を作成

openssl genrsa 1024 > private-key1.pem
openssl req -x509 -new -key private-key1.pem -out cert1.pem -days 356

Bさんが以下を実行して、鍵と証明書を作成

openssl genrsa 1024 > private-key2.pem
openssl req -x509 -new -key private-key2.pem -out cert2.pem -days 356

AさんがBさんへ自分の証明書cert1.pemを渡して、BさんがAさんに自分の証明書cert2.pemを渡す。

Aさんがmail.txtというメールを書いてBさんの証明書cert2.pemで暗号化。これによりcert2.pemの秘密鍵を持っているBさんしか開けなくなる。

openssl smime -encrypt -des3 -in mail.txt -out encrypt.txt cert2.pem

これだけでも暗号化はされるが、Aさんが送ったか確定できないので、Aさんが自分の秘密鍵と証明書で署名をおこなう。

openssl smime -sign -in encrypt.txt -signer cert1.pem -inkey privkey1.pem -out sign.txt

このsign.txtをBさんに送る。

Bさんはまず署名を確認する。

openssl smime -verify -in sign.txt -CAfile cert1.pem -out sign_verify.txt

署名が正しいので復号化する。

openssl smime -decrypt -recip cert2.pem -inkey private-key2.pem -in sign_verify.txt -out plain.txt

これでAさんから送られたmail.txtが暗号化されてBさんがplain.txtとして読める。

S/MIMEの普及しないのは下記のような理由によるのではないかと思う。

  • 証明書を正式に発行するのが面倒だったり費用がかかったりする
  • 署名と暗号化は別なのだが分かりにくい
  • 複数人に送る場合、全ての人の証明書が必要で煩雑になる
  • ヘッダーは暗号化されない

とはいえ、メール関係で新しい仕組みができて普及するるとも思えないのでS/MIMEをうまい具合に使っていくしかないのかもしれない。