openssl と nginx をソースからビルドして ALPN 対応させる

HTTP/2 対応したつもりでいたのですが、気がついたら Firefox の HTTP/2 Indicator add-on が灰色になってました。

どうみても HTTP/1.1 です。本当にありがとうございました。

ということで、再び青い稲妻アイコンを目にするまでの記録👇

HTTP/2 対応状況を確認

HTTP/2 の対応状況について確認できるサイトがあるので、 URL を入力して調べてみる。調べてみる。

Online HTTP/2 test - Quickly test if the URL is delivered via the new HTTP/2.0 protocol.

HTTP/2 対応と表示はグリーンになるが、どうやら ALPN が有効ではないらしい。

TLS で使用されるプロトコルネゴシエーションの方式には、 NPN と ALPN と2種類あり、Chrome は 2016年5月に NPN のサポートが切られたようですが、Firefox 52 でもいつの間にかサポートされなくなった模様?
(リリース情報を見つけられず。。。)

Firefox 53 では NPN 対応は廃止されるようです。

openssl と nginx をソースからビルドしてインストールする

openssl を ALPN 対応の 1.02 以降にし、その openssl を利用した nginx をビルドし、インストールします。

(👇にコマンドを並べたけど、実際には Itamae のレシピを書いてサーバに流した。)

openssl 1.1.0e のインストール

まずはパッケージインストール。無くてもビルドは完走するのだが、 make test が通らない。

yum install perl-core

2017.04.09 時点での最新版を取得し、展開後 make する。

cd /usr/local/src
wget https://www.openssl.org/source/openssl-1.1.0e.tar.gz
tar xvf openssl-1.1.0e.tar.gz
cd openssl-1.1.0e
./config
make
make test
make install

出来上がったバイナリを実行すると shared object file が見つからないと言われるので、 /etc/ld.so.conf.d/openssl-1.1.0e.conf ファイルを作って以下ように PATH を記述しておく。

$ etc/ld.so.conf.d/openssl-1.1.0e.conf
/usr/local/lib64

バージョンが変わったか確認。

$ openssl version
OpenSSL 1.1.0e  16 Feb 2017

nginx 1.11.1

まずは、ビルドに必要なパッケージをインストール。

sudo yum install libxslt-devel gd-devel GeoIP-devel --enablerepo=epel

yum でインストールした nginx のビルドオプションを調べ、それを元に configure のオプションを作ることにする。

$ nginx -V
nginx version: nginx/1.11.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_perl_module=dynamic --add-dynamic-module=njs-1c50334fbea6/nginx --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'

configure のオプションに、 --with-openssl=/usr/local/src/openssl-1.1.0e を追加しておく。また、--add-dynamic-module=njs-1c50334fbea6/nginx は削除しておく。

cd /usr/local/src
wget http://nginx.org/download/nginx-1.11.13.tar.gz
tar xvf nginx-1.11.13.tar.gz
cd nginx-1.11.13
./configure --prefix=/etc/nginx --with-openssl=/usr/local/src/openssl-1.1.0e --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_perl_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'
make
make test
make install

バージョンが変わったか確認。built with OpenSSL 1.1.0e 16 Feb 2017 になってますね。

$ nginx -V
nginx version: nginx/1.11.13
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
built with OpenSSL 1.1.0e  16 Feb 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --with-openssl=/usr/local/src/openssl-1.1.0e --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_perl_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'

HTTP/2 は有効になっているか?

nginx を restart し、 HTTP/2 対応状況を確認します。

ALPN supported になったようです。

Indicator の稲妻も青くなりましたね!

参考サイト

m(_ _)m

概要 Chrome Extention の HTTP/2 and SPDY indicator は HTTP/2 で通信していることを確認する Chrome の拡張 Pluginです。 これがある日 not enable となっていたので その対応をまとめます。 結果的に何が原因だったか ALPN をサポートしていなか...
スポンサーリンク
shiftky_blog_336

シェアする

  • このエントリーをはてなブックマークに追加

フォローする