mod_http2 脆弱性対応

パッチ配布元SVNからダウンロードする

CentOS7 apache http/2 対応

あぱーブログさんを参考にさせて頂きました。

mod_http2のRPMが見つからなかったのでソースから導入しました。

■ 開発ツール
 ソースからコンパイル・ビルドする為にgccなどを導入しました。

# yum -y groupinstall base
# yum -y groupinstall development
# yum -y install zlib-devel
# yum -y install libev-devel
# yum -y install libuuid-devel lua-devel libxml2-devel
# yum -y install python-devel

■ OpenSSL

wget https://www.openssl.org/source/openssl-1.0.2g.tar.gz
# tar xvzf openssl-1.0.2g.tar.gz
# cd openssl-1.0.2g/
# ./config --prefix=/usr/local/openssl-1.0.2g shared zlib
# make
# make install
# echo /usr/local/openssl-1.0.2g/lib > /etc/ld.so.conf.d/openssl102g.conf
# ldconfig

■ Nghttp2

wget https://github.com/nghttp2/nghttp2/releases/download/v1.9.2/nghttp2-1.9.2.tar.gz
# tar zxvf nghttp2-1.9.2.tar.gz
# cd nghttp2-1.9.2/
# autoconf -i
# automake
# autoconf
# env OPENSSL_CFLAGS="-I/usr/local/openssl-1.0.2g/include" OPENSSL_LIBS="-L/usr/local/openssl-1.0.2g/lib -lssl -lcrypto" ./configure
# make
# make install
# echo /usr/local/lib > /etc/ld.so.conf.d/local.conf
# ldconfig

■ Apache 2.4系

wget http://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.4.20.tar.gz
# tar zxvf httpd-2.4.20.tar.gz
# cd httpd-2.4.20/
# ./configure --enable-http2 --enable-ssl --with-ssl=/usr/local/openssl-1.0.2g -enable-so --enable-mods-shared=all --with-mpm=prefork
# make
# make install
# vi /usr/local/apache2/conf/httpd.conf
# 変更箇所のみ抜粋
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule http2_module modules/mod_http2.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule php5_module modules/libphp5.so
#
User apache
Group apache
#
AddHandler cgi-script .cgi .pl
#
Include conf/ssl.conf
#
ServerTokens Prod
ServerSignature Off
cp -p /etc/httpd/modules/libphp5.so /usr/local/apache2/modules/
# vi /usr/local/apache2/conf/ssl.conf
# 変更箇所のみ抜粋
SSLProtocol -All +TLSv1 +TLSv1.1 +TLSv1.2
SSLCipherSuite !SSLv2:!SSLv3:kEECDH:kRSA:kEDH:kPSK:!aNULL:!eNULL:!3DES:!MD5:!EXP:!RC4:!SEED:!IDEA:!DES
SSLHonorCipherOrder on

<VirtualHost *:443>
Protocols h2 http/1.1
ProtocolsHonorOrder On
H2Direct on

Config確認

# /usr/local/apache2/bin/apachectl -t
Syntax OK

起動確認

# systemctl stop httpd
# systemctl disable httpd

# /usr/local/apache2/bin/apachectl start
# nghttp http://localhost -v|grep HEADERS
[  0.001] send HEADERS frame <length=34, flags=0x25, stream_id=13>
          ; END_STREAM | END_HEADERS | PRIORITY
[  0.029] recv HEADERS frame <length=95, flags=0x04, stream_id=13>
          ; END_HEADERS

# nghttp https://localhost -v|grep HEADERS
[  0.012] send HEADERS frame <length=37, flags=0x25, stream_id=13>
         ; END_STREAM | END_HEADERS | PRIORITY
[  0.128] recv HEADERS frame <length=169, flags=0x04, stream_id=13>
         ; END_HEADERS

「stream_id=13」となっていれば成功です。

ブラウザで確認

chromやFirefoxがHTTP/2に対応しています。
もちろんWindows 10 edgeも対応しています。
HTTP/1.1かHTTP/2どちらでアクセスしているか確認できるインジケーターのプラグインを入れると分かりやすいです。

画像の説明 Firefoxの例です。
画像の説明
稲妻マークがブルーならHTTP/2で通信できています。
グリーンの時はSPDY v3の様です。
chromの場合は「chrome://net-internals/#http2」で確認できます。
apacheのログにも「"GET /favicon.ico HTTP/2" 200」等と記録されていました。