してみるテストロゴ
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

再起動します。

NEXT >> HTTP/2の動作確認

©Copyrights 2015-2018, non-standard programmer

このサイトは、あくまでも私の個人的体験を、綴ったものです。 軽く参考程度にご利用ください。