読者です 読者をやめる 読者になる 読者になる

Carpe Diem

備忘録。https://github.com/jun06t

NginxでHTTP/2(ALPN対応)

概要

以前NginxでHTTP/2 - Carpe Diemを書きましたが最近改めて確認してみると

f:id:quoll00:20160730114149p:plain

のようにHTTP/2が使えていないことが分かりました。今回はこの問題に対応します。

原因

TLS上でのプロトコルネゴシエーションは以下の2つがあるのですが、

ネゴシエーション ポイント
NPN 使用出来るプロトコルのリストをサーバが提示しクライアントが選択する
ALPN 使用出来るプロトコルのリストをクライアントが提示しサーバが選択する

SPDYがまだ使えていた時にはChromeもNPNに対応していたのですが、HTTP/2に本格的に対応してからALPNのみにしか対応しなくなりました。またAndroidのHTTPクライアントである

github.com

もALPNでないといけないので、ネイティブアプリでHTTP/2を扱う上でやはりALPNに対応する必要があります。

ALPNに対応するにはOpenSSL1.0.2以上でなくてはいけません。一方でUbuntu14.04は1.0.1系しか対応してないので、扱うことができません。

対応方法

  • Ubuntu 16.04を使う
  • OpenSSL 1.0.2をダウンロードして、Nginxを自前でコンパイルする

の2つがあります。ただOpenSSLでセキュリティの問題が起きた時に簡単に対応できるのは前者なので、前者をオススメします。

環境

  • Ubuntu 16.04
  • OpenSSL 1.0.2g
  • Nginx 1.11.3

UbuntuとOpenSSLの環境が上記より上であれば、あとは以前のやり方と同じです。

※Nginxのパッケージ管理部分はtrustyからxenialにしてください

christina04.hatenablog.com

検証

では改めて確認してみます。 f:id:quoll00:20160730121518p:plain

大丈夫ですね。

コマンドから確認

コマンドラインから確認する方法は以下です。www.example.comというドメインとしてます。

ALPN対応かどうか確認

$ echo | openssl s_client -alpn h2 -connect www.example.com:443

対応していれば

ALPN protocol: h2

非対応なら

No ALPN negotiated

といった表示がされます。

NPN対応かどうか確認

$ echo | openssl s_client -nextprotoneg h2 -connect www.example.com:443

対応していれば

Next protocol: (1) h2
No ALPN negotiated

といった表示がされます。

ソース