R に関する挙動は仕様でした。 man に次の様に記述されています。 2008/10/15 -quiet, -ign_eof オプションが指定されていない時、R で始まる行があると再接続を試み、 Q で始まる行があると接続を終了する。 # man s_client : CONNECTED COMMANDS If a connection is established with an SSL server then any data received from the server is displayed and any key presses will be sent to the server. When used interactively (which means neither -quiet nor -ign_eof have been given), the session will be renegotiated if the line begins with an R, and if the line begins with a Q or if end of file is reached, the connection will be closed down. : |
1、TLS でしかアクセス出来ない事の確認 $ telnet
localhost 587
Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. 220 mail.xxxxxx.yy.zz ESMTP unknown ehlo localhost 250-mail.xxxxxx.yy.zz 250-PIPELINING 250-SIZE 10240000 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN auth cram-md5 530 5.7.0 Must issue a STARTTLS command first 2、TLS でアクセスし、SMTP サーバーを利用する。 (パスワードがネット上を流れる、LOGIN、PLAIN の認証は許可しない) $ openssl
s_client -connect localhost:587 -starttls smtp
CONNECTED(00000003) : 220 mail.xxxxxx.yy.zz ESMTP unknown ehlo localhost 250-mail.xxxxxx.yy.zz 250-PIPELINING 250-SIZE 10240000 250-ETRN 250-AUTH CRAM-MD5 DIGEST-MD5 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN auth cram-md5 334 PDkzODUuMTIxMzA2Mzk2M0BtYWlsPg== dXNlcjEgMmFkZjQxZmU0MjhiMDUwNjE4ODliYjc5NjJlOThlZWI= 235 2.0.0 Authentication successful mail from:user1@domain1 250 2.1.0 Ok rcpt to:user2@domain2 250 2.1.5 Ok data 354 End data with<CR><LF>.<CR><LF> Subject:test test . 250 2.0.0 Ok: queued as B4E451400555 quit 221 2.0.0 Bye read:errno=0 $ 3、 334 Challenge (PDkzODUuMTIxMzA2Mzk2M0BtYWlsPg==) に対する Response (応答メッセージ) の作成 3-1、BASE64 形式の Challenge文字 "PDkzODUuMTIxMzA2Mzk2M0BtYWlsPg==" をデコードする。
サーバーから送られて来た、チャレンジ文字列は次の通り。 <9385.1213063963@mail> チャレンジ文字列は毎回変更される。 3-2、メールアカウント user1 のSMTP サーバーに設定されているパスワードが passwd1 である場合。 <9385.1213063963@mail> と passwd1 を使って、 MD5(Message Digest) を生成する。 生成されたMD5(Message Digest) は次の文字列 2adf41fe428b05061889bb7962e98eeb 前提として、メッセージダイジェスト(文字要約)の文字列からは元のパスワード passwd1 を解析& 解読できない。 MD5(Message Digest)は、実用に耐えられる程に十分なユニーク性を持っている。 (容易に同じ文字列に変換されない。 MD5のコリジョンについて確認することを推奨します。) 実際の実装方法は不明ですが、強度的にはMD5を作成する文字列の最初に password が有るのは好まし くありません。 3-3、メールアカウント user1 と Challenge+Password から生成された MD5(Message Digest) を BASE64 形式にエンコードする。 エンコードされた文字列 dXNlcjEgMmFkZjQxZmU0MjhiMDUwNjE4ODliYjc5NjJlOThlZWI= は、 以下の平文を BASE64エンコードしたもので、デーコードすると元の平文が得られる。(可逆変換) user1 2adf41fe428b05061889bb7962e98eeb 3-4、サーバーに dXNlcjEgMmFkZjQxZmU0MjhiMDUwNjE4ODliYjc5NjJlOThlZWI= を送る。 Ex. use MIME::Base64; use Digest::HMAC_MD5 qw(hmac_md5_hex); print encode_base64($account.' '.hmac_md5_hex(decode_base64($challenge),$passwd)); 補足:サーバーは、送られて来たレスポンス文字列から、メールアカウントとMD5(Message Digest)を知る。 (メールアカウント:user1、 MD5(Message Digest):2adf41fe428b05061889bb7962e98eeb) サーバーは、サーバーに登録されているメールアカウントリストに送られて来たアカウントがあるか 調べ、該当するアカウントが存在する場合は、そのアカウントのパスワードと、クライアントに送った Challenge 文字列 <9385.1213063963@mail> を使って MD5(Message Digest) を自らも生成する。 サーバーで生成した、MD5(Message Digest)とクライアントから送られた来たMD5(Message Digest)の値 が一致した場合。 お互いは同じパスワードを所持している(パスワードが一致している)と判断し、メール転送を許可する。 |
go to TopPage | go to CategoryTop |