Nginx + OpenSSL 1.0.2h = ALPN。 Ubuntu 14.04でのALPNサポートの有効化

したがって、問題の本質を簡単に説明します。NginxとUbuntu 14.x-に基づくHTTP / 2を使用している場合、5月31日以降、HTTP / 2はChromeで動作しなくなります。 しかし、問題を解決するのは非常に簡単です。



HTTP / 2プロトコルを使用するには、通常のTLSからそれに切り替える方法のサポートが必要です。 このサポートは、ブラウザーとサーバーによって提供されます。 現在、このような2つの方法があります。NPN(Next Protocol Negotiation)とALPN(Application-Layer Protocol Negotiation)です。 最初のものは廃止され、2番目のものに置き換えられます。 ただし、ALPNを使用するには、かなり新しいバージョン(1.0.2+)のOpenSSLが必要です。古いバージョンではNPNのみがサポートされます。

Ubuntu 14.xに戻ります。OpenSSLバージョンは次のようになりました。

# openssl version OpenSSL 1.0.1f 6 Jan 2014
      
      





1.0.2への更新を待つ必要はありません。配布パッケージを更新するときだけです(たとえば、16.04まで)。

しかし、これはシステム上のバージョンであり、Nginxにのみ興味があります。これがUbuntuの新しいメインラインパッケージの説明です。

 # nginx -V nginx version: nginx/1.9.15 built by gcc 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.1) built with OpenSSL 1.0.1f 6 Jan 2014 TLS SNI support enabled configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/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=debian/extra/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='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,--as-needed'
      
      







肉眼では、同じバージョンのOpenSSL 1.0.1fに気付くことができます。 したがって、ALPNは当社と連携しません。

現時点で、GoogleチームはChromiumコードからのNPNサポートの最終的な切り捨て日である5月31日を既に発表しています。 ところで、SPDYも動作を停止します。



解決策





HTTP / 2のサポートが失われないようにするために、ALPNのサポートを既に行う必要があります。 もちろん、突然Ubuntu 16.04に切り替えることもできますが、これはすべての人に適しているわけではないと思います。

ソリューションのレシピは非常に簡単で理解しやすいものです。新しいOpenSSLに基づいてNginxを構築する必要があります。

ビジネスに取り掛かろう:



0.公式リポジトリからNginxをインストールします 。 これにより、サーバーの起動スクリプトがインストールされ、今後の作業に必要になります。 インストール後、リポジトリをコメントアウトして、その後の更新でカスタムNginxが破壊されないようにする必要があります。



1. NginxおよびOpenSSLのソースをダウンロードします(執筆時点でバージョンが示されています)。



 wget https://www.openssl.org/source/openssl-1.0.2h.tar.gz wget http://nginx.org/download/nginx-1.10.0.tar.gz
      
      







2.アーカイブを解凍します。



3. Nginxのビルドを成功させるためにパッケージをインストールします。



 sudo apt-get -y install build-essential libpcre3 libpcre3-dev zlib1g-dev checkinstall sudo apt-get build-dep nginx
      
      







4. Nginxを構成します。 これを行うには、OpenSSLソースフォルダー(--with-openssl = / home / db / openssl-1.0.2h )を追加して、 nginx -Vコマンドの出力の一部をコピーします。 次のものを入手しました(GeoIPモジュールを削除しました):

 --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/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_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='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,--as-needed' --with-openssl=/home/db/openssl-1.0.2h
      
      







構成プロセス中にエラーが発生した場合、おそらく依存関係は見つかりませんでした。 これは通常、 libXYZ-devのようなパッケージをインストールすることで処理されます。



5. Nginxを(ソースフォルダーに)収集します。



 make
      
      







6.次に、make installを実行できますが、モジュールを組み立てます。 より便利できれいになります(更新、削除など)。これを行うには:



 sudo checkinstall --pkgname=nginx --pkgversion=1.10.0 --nodoc
      
      







モジュールを構築するプロセスでは、モジュールの説明を入力する必要があります。Nginx+ OpenSSL 1.0.2のようなものを残すことができます。 その後、パッケージがインストールされます。 同様のシステム間で転送して、通常どおりインストールすることもできます。



 dpkg -i nginx_1.10.0-1_amd64.deb
      
      







7. ここまたはコマンドラインでAPLNサポートを確認できます(システムにはバージョン1.0.2+が必要です)



 echo | openssl s_client -alpn h2 -connect your-host:443 | grep ALPN
      
      







以上です!



All Articles