9/27に突然さくらインターネットへのデータ転送ができなくなった。
さくらインターネットサーバで、ApacheのVersionアップ(2.2–>2.4)を行ったタイミングと一致。
そこで、さくらに問い合わせるが相変わらずサポート悪く、3日後の9/30に下記のメールが返信されてきた。
・質問内容
>———————————————————-
>件名:障害・メンテナンスについて
>———————————————————-
>本日(9/27)AM11:45頃から、www1110.sakura.ne.jpサーバーの、私のWWWフォルダー内のPHPファイルが動作しなくなりました。現在3つのセンサーシステムのデータを、HTTP GET文でさくらサーバーに送信し、それぞれ別のファイルにデータを保存していますが、3つのセンサーシステムのデータが、同時にサーバーに取り込めなくなりました。 ちなみに、3つのセンサーシステムは、それぞれ別々のマイコンで動作しているので、それらが突然、同時にデータを送信しなくなることは考えられません。また過去2年間、このような問題は発生していません。 恐れ入りますが、さくらレンタルサーバー(www1110.sakura.ne.jp)で、何か心当たりのイベント、トラブルの発生がありましたら、ご連絡ください。よろしくお願いいたいます。
・さくらの回答───────────────────────────────────
上記の件に影響を及ぼした直接の原因、問題なのか判別は
困難となりますが、ご指摘の期間に以下のメンテナンスが実施されておりました。
▼ さくらのレンタルサーバ・さくらのマネージドサーバ
http://support.sakura.ad.jp/mainte/mainteentry.php?id=22624
誠に恐れいりますが内容のご確認よろしくおねがいいたします。
原因と対策
いろいろ調べて、Programを作って試したところ、HTTP通信の記述が、HTTP ProtocolのBasic Ruleに則っていないことが原因であることがわかった。
そこで、HTTP GETの記述を以下のように変更。
・従来の文法:
client.connect(server, 80)
…..
client.write(” HTTP/1.1\n”);
client.write(“HOST:miyasan.sakura.ne.jp\n\n”);
・変更後(改行の追加、connect – close ワンセットで記述:
client.connect(server, 80)
……
client.write(” HTTP/1.1\r\n”);
client.write(“HOST:miyasan.sakura.ne.jp\r\n”);
client.write(“Connection: close\r\n\r\n”);
・Basic Rule
HTTP Protocolを規定しているRFC 2616 (Section 2.2, “Basic Rules”)によると:
HTTP/1.1 defines the sequence CR LF as the end-of-line marker for all protocol elements except the entity-body (see appendix 19.3 for
tolerant applications). The end-of-line marker within an entity-body is defined by its associated media type, as described in section 3.7.
CRLF = CR LF
だそうだ。
一方、Applicationに対しては、耐障害性が求められており、19.3 Tolerant Applicationsによれば、
Although this document specifies the requirements for the generation of HTTP/1.1 messages, not all applications will be correct in their implementation. We therefore recommend that operational applications be tolerant of deviations whenever those deviations can be interpreted unambiguously.
Clients SHOULD be tolerant in parsing the Status-Line and servers tolerant when parsing the Request-Line. In particular, they SHOULD accept any amount of SP or HT characters between fields, even though only a single SP is required.
The line terminator for message-header fields is the sequence CRLF. However, we recommend that applications, when parsing such headers, recognize a single LF as a line terminator and ignore the leading CR.
とのこと。
Apache2.2では、記述の寛容性があったが、2.4ではSecurityの観点から厳格化されたのだろうか・・・・。
この問題で丸2日も時間を使ってしまった。
さくらインターネットも、メンテ情報をきちんとメールで知らせて欲しいものだ!
Apache2.2までは、マーカーとしてLFのみでも認識していましたが、Apache2.4.25からは、CR+LFに厳格化されたようです。
これに関する参考URLを送ります。
https://stackoverflow.com/questions/43574428/have-apache-accept-lf-vs-crlf-in-request-headers
https://httpd.apache.org/security/vulnerabilities_24.html
古いプログラムを使っているシステム・製品では、こうした問題に直面し困っているようです・・・。