"R" issue of openssl's s_client.c (Bug? Specification)


この問題は、-quiet や -ign_eof を指定することでも回避できますので、使用上支障がないならどうぞ。(update 2008/06/11)
オプションの指定場所に注意。 s_client の後に指定するのが無難
openssl s_client -quiet -connect localhost:587 -starttls smtp
openssl s_client -ign_eof -connect localhost:587 -starttls smtp



TLS/SSL でしか接続許可していないメールサーバにアクセスする時に openssl を利用しますが、 s_client.cに不具合があるようです。
s_client を用いた接続時に問題を起こす事があります。

$ openssl s_client -connect localhost:587 -starttls smtp
CONNECTED(00000003)
    :
Server certificate
-----BEGIN CERTIFICATE-----
MIIIADCCBuigAwIBAgIDAZF1MA0GCSqG..........
    :
    :
RCPT TO:user@mail-domain と入力するとRENEGOTIATING(再度ネゴシエーションを開始する)が発生します。
RENEGOTIATING
    :
report return:1


これは、RCPT TO: に限った問題ではなく先頭の文字が ”R” であれば常に発生します。
回避策としては、先頭の一文字を小文字に変更します。
rCPT TO:user@mail-domain
250 2.1.5 Ok


どんな文字列であれ、最初の文字が大文字の "R" であれば常に発生していますので単純な bug で直ぐに解決されるでしょうが、
Work Around(問題回避方法)として、小文字でコマンドを入力してみては如何でしょうか。

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.
    :

RRR
RENEGOTIATING
    :
rrr
502 5.5.2 Error: command not recognized
    :

rRR
502 5.5.2 Error: command not recognized
    :

Role
RENEGOTIATING
    :
role
502 5.5.2 Error: command not recognized




参考資料:

SMTP サーバーへのアクセス手順 ( Submission Port 587 が開いていない場合は、通常の Port 25 を使用)
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