コマンドラインでメール/GPG で暗号化と復号

msmtpmsmtp-mta をインストールすると sendmail 互換のコマンドが生えるため CLI からメールがサクっと送れる。 これは Git で ML に patch に送る際に便利である。

defaults
auth    on
tls     on
tls_trust_file /etc/ssl/certs/ca-bundle.crt
logfile ~/.msmtp.log

account         gmail
host            smtp.gmail.com
port            587
from            example@gmail.com
user            example
passwordeval    "gpg --quiet --for-your-eyes-only --decrypt ~/.msmtp-gmail.gpg"

account         outlook
host            smtp.office365.com
port            587
from            example@outlook.com
user            example@outlook.com
passwordeval    "gpg --quiet --for-your-eyes-only --decrypt ~/.msmtp-outlook.gpg"

account default : gmail
こういう風に設定を書いておけばよい。 また,この際に password に平文でパスワードを書くこともできるが,passwordeval として暗号化されたファイルを復号するコマンドを記述すると, パスワードを暗号化し別に扱えるので便利である。

さて,ここで GPG の暗号化なのだが,暗号化のコマンドは以下の通り

➤ gpg --encrypt -o ~/.msmtp-gmail.gpg -r example@gmail.com -
password
^D
-r に指定するメールアドレスは自分の GPG 秘密鍵に登録してあるメールアドレスである。 コマンドの末尾に - を指定しているので標準入力から暗号化するテキストを入力することになり, Ctrl-D で入力を打ち切る。 この例では「password」という文字列を暗号化して ~/.msmtp-gmail.gpg に保存することになる。

しかしここでハマりポイントがある。

gpg: XXXXXXXX: There is no assurance this key belongs to the named user
などと言われる場合だ。他所のマシンから秘密鍵を持ってきて import したときなどに起きる。 これは自分の鍵を信用する設定にし忘れているため,
➤ gpg --edit-key XXXXXX
と鍵のシグネチャを指定し edit-key をすれば良いのだが,
gpg: can't do this in batch mode
と言われるのだ。これは昔には起きなかった気がする(どうして……)

➤ gpg --command-fd 0 --status-fd 1 --expert --edit-key XXXXXXXXX
[GNUPG:] KEY_CONSIDERED XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 0
Secret key is available.

...(略)...

[GNUPG:] GET_LINE keyedit.prompt
trust
[GNUPG:] GOT_IT

...(略)...

Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I don't know or won't say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  5 = I trust ultimately
  m = back to the main menu

[GNUPG:] GET_LINE edit_ownertrust.value
5
[GNUPG:] GOT_IT
[GNUPG:] GET_BOOL edit_ownertrust.set_ultimate.okay
y
[GNUPG:] GOT_IT

...(略)...

[GNUPG:] GET_LINE keyedit.prompt
quit
[GNUPG:] GOT_IT
このように, --command-fd--status-fd などをそれぞれ標準入力,標準出力にし,あとは,「trust 5 y quit」と順番にコマンドを入れていけばよい。