概要
以前NginxでHTTP/2 - Carpe Diemを書きましたが最近改めて確認してみると
のようにHTTP/2が使えていないことが分かりました。今回はこの問題に対応します。
原因
TLS上でのプロトコルのネゴシエーションは以下の2つがあるのですが、
ネゴシエーション | ポイント |
---|---|
NPN | 使用出来るプロトコルのリストをサーバが提示しクライアントが選択する |
ALPN | 使用出来るプロトコルのリストをクライアントが提示しサーバが選択する |
SPDYがまだ使えていた時にはChromeもNPNに対応していたのですが、HTTP/2に本格的に対応してからALPNのみにしか対応しなくなりました。またAndroidのHTTPクライアントである
もALPNでないといけないので、ネイティブアプリでHTTP/2を扱う上でやはりALPNに対応する必要があります。
ALPNに対応するにはOpenSSL1.0.2以上でなくてはいけません。一方でUbuntu14.04は1.0.1系しか対応してないので、扱うことができません。
対応方法
の2つがあります。ただOpenSSLでセキュリティの問題が起きた時に簡単に対応できるのは前者なので、前者をオススメします。
環境
- Ubuntu 16.04
- OpenSSL 1.0.2g
- Nginx 1.11.3
UbuntuとOpenSSLの環境が上記より上であれば、あとは以前のやり方と同じです。
※Nginxのパッケージ管理部分はtrustyからxenialにしてください
検証
では改めて確認してみます。
大丈夫ですね。
コマンドから確認
コマンドラインから確認する方法は以下です。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
といった表示がされます。