Apache 2.4系でHTTP/2サーバを構築してみるテスト。
TLS接続のHTTP/1.1プロトコルの確認当サイトは、HTTP/2を推奨しているのですが、互換性のためにTLS接続+HTTP/1.1の組み合わせ、(いわゆるhttps)を利用することもまだまだあると思います。 ところが、Apache HTTPD Webサーバの2.2.32以降もしくは 2.4.24以降では、HTTPプロトコルの挙動に小さな変化がありました。 デフォルトの動作が、CR+LF以外の改行をエラー扱いするようになりました。 この対策を説明したいと思います。
Apache HTTPD Webサーバの2.2.32以降もしくは 2.4.24以降の挙動Apache HTTPD Webサーバの2.2.32以降もしくは 2.4.24以降では、HttpProtocolOptionsディレクティブが導入され、デフォルトでは、以下の設定と等価になっています。つまり、 httpd.conf
HttpProtocolOptions Strict LenientMethods Allow0.9 となっており、例えば、CR+LF(\r\n)以外の改行だとエラーとなってしまいます。 例えば、UnixやLinuxのコマンドラインからエンターキーを押すと、LF(\n)だけが送信さえます。 そのため、 # openssl s_client -host http2.try-and-test.net -port 443 -servername http2.try-and-test.net (・・・中略・・・) --- read R BLOCK GET / HTTP/1.0 と入れると、 HTTP/1.1 400 Bad Request と400番のエラーが、帰ってきます。
コマンドラインのOpenSSLクライアントを使って、改行としてCR+LFを送信するOpenSSLのコマンドラインからエンターキーを使って、CR+LFを送信するには、-crlfオプションを使います。 (※ OpenSSL 1.0.1以前のバージョンは、サポート期限が終了しています。OpenSSL 1.0.2以降を利用してください。) 例えば、先ほどの例に-crlfを加えて、 # openssl s_client -crlf -host http2.try-and-test.net -port 443 -servername http2.try-and-test.net (・・・中略・・・) --- read R BLOCK GET / HTTP/1.1 host: http2.try-and-test.net と入れると、リクエストが成功します。
Apache HTTPD Webサーバ側の挙動を従来のように、LFにも応答するようにする以前の挙動の方がしっくりくるという方は、以下のように設定すると、2.2.32よりも前、もしくは 2.4.24よりも前の挙動に戻ります。 # vi /usr/local/apache2/conf/httpd.conf /usr/local/apache2/conf/httpd.conf
HttpProtocolOptions Unsafe LenientMethods Allow0.9 apachctl -tで、設定ファイルの間違いが無いことを確認の上、下記のように # /usr/local/apache2/bin/apachctl -t Syntax OK # /usr/local/apache2/bin/apachctl stop # /usr/local/apache2/bin/apachctl start 再起動します。
|