毎秒1000リクエスト を捌く超高速CMS「adiary」
2019/02/11(月)Linux/Windowsで動く本格的なWebServerをPerlで作る
adiary Ver3.20から adiary.httpd.pl というスタンドアローンサーバが付属するようになりました。これを作成した際の知見メモ。
2019/01/20(日)Net::SMTPでSMTP AUTHのDIGEST-MD5に失敗する問題
さくらインターネットのメールサービスを使用して、SMTP AUTHのDIGEST-MD5認証を使うと送信に失敗する問題を調べてみました。
問題の詳細
PerlのNet::SMTPモジュール等を使用して、さくらインターネットのメールサービスを使い、SMTP Authでメールを送信する失敗します。
ネットで検索するとPerlのNet::SMTPの問題と書かれていたりもしますが、実際にはさくらインターネット側の問題のようです。
SMTPのログを取ってみるとこんな感じになります。
> 220 www1234.sakura.ne.jp ESMTP Sendmail 8.15.2/8.15.2; Sun, 20 Jan 2019 21:25:22 +0900 (JST) EHLO localhost.localdomain > 250-www1234.sakura.ne.jp Hello xxxx [192.168.0.1], pleased to meet you 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-8BITMIME 250-SIZE 209715200 250-DSN 250-AUTH CRAM-MD5 DIGEST-MD5 LOGIN PLAIN 250-STARTTLS 250-DELIVERBY 250 HELP > AUTH DIGEST-MD5 (decoded) nonce="UOM8WDtDO5/ZOCm+tpQaxjRbHOCM5Y5CKekiBEVlmU8=", realm="www1234.sakura.ne.jp", qop="auth,auth-int,auth-conf", cipher="c4-40,rc4-56,rc4,des,3des", maxbuf=8192,charset=utf-8,algorithm=md5-sess >(decoded) authzid="smtp@example.jp",charset=utf-8,cipher=rc4, > cnonce="eedacf2b08dc6c60a2a799ee59188455", > digest-uri="smtp/XXXXXXXX.sakra.ne.jp", > nc=00000001,nonce="UOM8WDtDO5/ZOCm+tpQaxjRbHOCM5Y5CKekiBEVlmU8=", > qop=auth-conf,realm="www1236.sakura.ne.jp", > response=c54d120c415a6e3d5cd5469b36faa7e1 > username="smtp@example.jp" (decoded) rspauth=fc45f7aa080db4dfb73d1b65a1f48d50 > 235 2.0.0 OK Authenticated > MAIL FROM:<test@example.jp> Net::SMTP: Net::Cmd::getline(): unexpected EOF on command channel:
ソースに手を入れていろいろ調べてみたところ、
235 2.0.0 OK Authenticated
を受け取ったあと、どんなコマンドを送っても切断されているようです。コマンドを送るまでソケットは生きているのですが、改行してコマンドを確定した瞬間にソケットの強制切断を喰らいます。これを回避するために、なにか特殊な暗号をしゃべるべきなのかもしれませんが皆目検討が付きません。
問題の切り分け
問題を切り分けるために、自前でSMTP AUTH / DIGEST-MD5認証対応のpostfixサーバを構築して実験してみたところ、問題なく送信できました。これにより、さくらインターネット側の不具合の可能性がかなり濃厚になってきました。
なぜ問題が放置されているのか?
ほとんどのメーラー(メールクライアント)は、SMTP AUTHの認証方法を細かく指定することができません。内部で良きにはからってくれるので、仮にDIGEST-MD5認証に挑戦して失敗しても、CRAM-MD5等の他の認証方法を試します。
PerlのNet::SMTPモジュールではなぜ問題が起こるのか?
Net::SMTPモジュールは「EHLO」で返された「AUTH」の中で、最初に対応しているものを認証手段として選択します。失敗しても次の認証方法を試したりはしません。結果として、さくらインターネットのメールサービスと組み合わせて使用すると、SMTP Authに失敗します。
ひとこと
さくらインターネットちゃんとしてください(笑)*1