SMTP AUTH を手で叩くためのメモ

必要なときには忘れてるのでメモ。

SMTP AUTH というか SASL なので、SMTP じゃなくて IMAP でも同様だと思います。

ユーザー名: hoge@example.com

パスワード: abcdefg

テストのための環境準備

OS は Ubuntu。

パスワード登録:

# apt install sasl2-bin
# saslpasswd2 -c hoge -u example.com
Password: abcdefg
Again (for verification): abcdefg

Postfix で SASL を使用:

# chmod 644 /etc/sasldb2
# postconf -F smtp/inet/chroot=n
# postconf smtpd_sasl_auth_enable=yes
# postfix reload

PLAIN認証

https://tools.ietf.org/html/rfc4616

平文。暗号化されていない。

サーバー側ではパスワードを平文で保存しておかなくてもいい。

% ruby -e 'puts [[ARGV[0], ARGV[0], ARGV[1]].join("\0")].pack("m0")'\
 hoge@example.com abcdefg
aG9nZUBleGFtcGxlLmNvbQBob2dlQGV4YW1wbGUuY29tAGFiY2RlZmc=
C: AUTH PLAIN aG9nZUBleGFtcGxlLmNvbQBob2dlQGV4YW1wbGUuY29tAGFiY2RlZmc=
S: 235 2.7.0 Authentication successful

または

C: AUTH PLAIN
S: 334
C: aG9nZUBleGFtcGxlLmNvbQBob2dlQGV4YW1wbGUuY29tAGFiY2RlZmc=
S: 235 2.7.0 Authentication successful

LOGIN認証

https://tools.ietf.org/html/draft-murchison-sasl-login-00

平文。暗号化されていない。

サーバー側ではパスワードを平文で保存しておかなくてもいい。

% ruby -e 'puts [ARGV[0]].pack("m0"), [ARGV[1]].pack("m0")'\
 hoge@example.com abcdefg
aG9nZUBleGFtcGxlLmNvbQ==
YWJjZGVmZw==
C: AUTH LOGIN
S: 334 VXNlcm5hbWU6
C: aG9nZUBleGFtcGxlLmNvbQ==
S: 334 UGFzc3dvcmQ6
C: YWJjZGVmZw==
S: 235 2.7.0 Authentication successful

サーバーから返される2つの文字列はプロンプト文字列:

% ruby -e 'puts "VXNlcm5hbWU6".unpack1("m")'
Username:
% ruby -e 'puts "UGFzc3dvcmQ6".unpack1("m")'
Password:

CRAM-MD5認証

https://tools.ietf.org/html/rfc2195#section-2

ハッシュ化文字列。

サーバー側でパスワードを平文で保存しておく必要がある。

C: AUTH CRAM-MD5
S: 334 PDIyNTYzMjQ5MzIuMTA3Mjc5MzlAdDQ2MHM+
% ruby -ropenssl -e 'puts [[ARGV[0], OpenSSL::HMAC.hexdigest("MD5", ARGV[1], ARGV[2].unpack1("m"))].join(" ")].pack("m0")'\
 hoge@example.com abcdefg PDIyNTYzMjQ5MzIuMTA3Mjc5MzlAdDQ2MHM+
aG9nZUBleGFtcGxlLmNvbSA3OGIxNWZiNDMyZGNiYWJjMmYyZDIxZDQ0OGI3ZmY2OQ==
C: aG9nZUBleGFtcGxlLmNvbSA3OGIxNWZiNDMyZGNiYWJjMmYyZDIxZDQ0OGI3ZmY2OQ==
S: 235 2.7.0 Authentication successful