自分んとこのWebサイトを常時SSL対応にして HTTP/2 にも対応させてみた

Web 周りも、新しい技術を試してみようと思うと、サーバとクライアントの間の SSL 化が前提となってたり、無料でサーバ証明書を提供する Let's Encrypt というプロジェクトも正式サービスに向けてのベータテストが始まったりと、いいタイミングでもあるので、SSL 化と HTTP/2 対応を試みてみたので、そのログを残しておく。

まずは、常時 SSL 対応に

ツールのインストールから証明証の発行までは有志による Let's Encrypt 総合ポータルが参考になるので、そちらも参照しつつ、差分となるところを中心に書いていきます。

まず専用のクライアントソフトをインストールして〜、という話から始めなくちゃと思ったら、 Debian の sid 向けにはパッケージが提供されているので、それをインストール。
#最初試した時(11月の中頃)は、パッケージとして取り込まれてなかった記憶が…。
# jessie 対応は、別途書きますかね…。

いつもどおりというか、 "aptitude install letsencrypt" 一発で関連パッケージもインストールされるので、それで終わり。

root@vps2:~# aptitude install letsencrypt
以下の新規パッケージがインストールされます:
letsencrypt python-acme{a} python-configargparse{a} python-configobj{a} python-dialog{a}
python-funcsigs{a} python-letsencrypt{a} python-mock{a} python-parsedatetime{a}
python-pbr{a} python-psutil{a} python-pyicu{a} python-rfc3339{a} python-werkzeug{a}
python-zope.component{a} python-zope.event{a} python-zope.hookable{a}
python-zope.interface{a}
更新: 0 個、新規インストール: 18 個、削除: 0 個、保留: 20 個。
1,013 k バイトのアーカイブを取得する必要があります。展開後に 5,225 k バイトのディスク領域が新たに消費されます。
先に進みますか? [Y/n/?]

とりあえず、ここまででサーバ証明書を取得する準備が完了。

これ以降は、Let's Encrypt 総合ポータルの Let's Encrypt の使い方を参照しながら、行きます。
クライアントのインストール部分はすっ飛ばして、証明書の取得のパートからで OK。但し、Debian のパッケージではコマンド自体の名前が変更されている( letsencrypt-auto → lets encrypt )ので、その部分は読み替えが必要なのと、この時点で apache が起動しているときは一度終了しておくこと、実際にサービスを提供するサーバの上で実行しないとハマるので、その点には注意。


で、注意点がクリア出来ていることが確認できたら、コマンドラインで、次のように実行します。

root@jessie:~# letsencrypt certonly -a standalone -d downtown.jp -d www.downtown.jp -d jessie.downtown.jp --server https://acme-v01.api.letsencrypt.org/directory

あとは、 Let's Encrypt の使い方にあるとおりに進めていけば、証明書の取得が完了します。

証明書が取得できたら、apache の設定を変更しましょう。
"a2enmod ssl" で SSL モジュールを有効にしたら、/etc/apache2/sites-enabled/default-ssl.conf 内の以下の3箇所を取得した証明書を使うように書き換えれば、最低限の設定が完了。これ以外の細かい設定は、各サイトの事情に合わせて設定してくださいね。

SSLCertificateFile/etc /letsencrypt/live/www.downtown.jp/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.downtown.jp/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.downtown.jp/chain.pem

これで、 apache を起動、Web ブラウザでアクセスして、ロケーションバーのところに鍵マークが入っているのが確認できれば、SSL の有効化完了となります。


念のため、証明書自体を表示させて、発行元などは確認しておきましょうね。



次は、HTTP/2 対応にしてみよう!

続いては HTTP/2 対応。これは、SSLが有効であることと、Apache HTTP Server の 2.4.17 がインストールされているのが前提です。

HTTP/2の目標はHTTP/1.1のトランザクション・セマンティクスとの完全な後方互換性を維持したまま非同期な接続の多重化、ヘッダ圧縮、リクエストとレスポンスのパイプライン化を実現することである。

[From HTTP/2 - Wikipedia]

Debian の場合、testing の stretch と unstable の sid は 2.4.17 なので、そのまま設定すれば動きますが、現行の stable である jessie は 2.4.10 になるので、sid からパッケージを借りてきてインストールといった手順が必要です。
# jessie での対応方法は、別項にて。

インストールができていれば、あとは /etc/apache2/sites-enabled/default-ssl.conf の "<VirtualHost _default_:443>~</VirtualHost>" の間に、以下のディレクティブを追記。 "SSLCipherSuite" の行は、1行で記入してください。

# ----- HTTP/2 Enabled
Protocols h2 http/1.1
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK SSLProtocol -All +TLSv1 +TLSv1.1 +TLSv1.2
# -----

設定項目については、 Apache 2.4.17 + mod_http2 インストールメモ【HTTP/2】 | あぱーブログ を参考にさせていただいています。

2015年10月13日にリリースされた Apache httpd 2.4.17 に mod_http2 が導入され、いよいよ Apache も HTTP/2 対応になりました。5月の HTTP/2のRFC 発表から約半年での実装になります。現時点(2015年10月18日)では yum などのパッケージ管理ツールは Apache 2.4.17 のインストールに対応していませんので、自前で依存関係を考慮しつつ、ソースコードからインストールする必要があります。そこで今回は、CentOS7.1 (1503) に Apache 2.4.17 と mod_http2 をインストールする手順をまとめてみました。

[From Apache 2.4.17 + mod_http2 インストールメモ【HTTP/2】 | あぱーブログ]

追記したら、mod_http2 の有効化をして、apache の再起動をすれば、対応完了。

root@vps2:~# a2enmod http2
Enabling module http2.
To activate the new configuration, you need to run:
service apache2 restart
root@vps2:~# apache2ctl graceful

確認は、ブラウザの開発者ツールとか

Web インスペクタで確認

実際のアクセスログとかで確認して、

2001:470:fc27:1:94cc:3edd:fd65:924a - - [13/Dec/2015:23:23:41 +0900] "GET / HTTP/2" 200 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9"

"HTTP/2.0" や "HTTP/2" というのが見えていればOK。

chrome://net-internals/#http2 で確認

HTTP/2 対応してる Web ブラウザであれば、自動的に HTTP/2 でアクセスしてくれるので、サーバ側で対応できていればアクセスで問題が起きることはなさそう。

そういえば、自分のところを HTTP/2 対応にして気がついたのだけど、 Squid は HTTP/2 に対応しているようですね。
#調べてみたら、 3.4 以降で対応になっている模様。

トラックバック(4)

ということで、前のエントリーで表明したとおり、jessie で... 続きを読む

for 文の繰り返し回数の制御を HTTP のバージョン番号である " 1.0 1.1 2" (実際にアクセスログ中に出てくるもの)で行うようにして、こ... 続きを読む

HTTP/2 対応させてから 10 日ほど経過したわけですが…。 続いては HTTP/2 対応。これは、SSLが有効であることと、Apache HTTP ... 続きを読む

今回やりたいこと しばらく前から、自分のところは HTTP/2 対応が完了していたんですが、apache2 パッケージを 2.4.27-* にアップデート... 続きを読む

コメントする