れみゅーぶろぐ

某(元)高専生が多彩なジャンルにわたって書くブログ。非常に真面目なブログであると自負しております(要出典)。Twitter:@_remew_

nginx1.9.9 × Let's Encrypt × http2を試してSSL LabでA+判定までもらう

前回のあらすじ

前回、さくらVPSUbuntuをインストールしてssh接続できるところまで進みました。

今日書くこと

  • Ubuntuにおけるhttp2に対応したnginxのインストール方法
  • Let's Encryptの軽い紹介
  • Let's Encryptを使用したhttps対応方法
  • http2にする方法
  • SSL LabでA+評価を取る方法

http2とは

つよい

未来っぽい

(場合によっては)ページ表示が早くなる

詳しくはググってください。

Ubuntu × nginx1.9.9

http2に対応するためにUbuntuにnginx1.9.9をインストールします。

sudo apt-get install nginx

嘘です。

ちなみに、http2に対応するには1.9.5以上なら良いのですが、apt-getでインストールしたかったので、公式サイトの手順をおこなったら1.9.9がインストールされました。

remew@vps~$ wget http://nginx.org/keys/nginx_signing.key
remew@vps~$ sudo apt-key add nginx_signing.key
remew@vps~$ sudoedit /etc/apt/sources.list

このタイミングでnanoが起動してブチ切れましたがその話はまた今度書きます。

うまくvimを起動できたら、末尾に次の2行を追加します

deb http://nginx.org/packages/mainline/ubuntu trusty nginx
deb-src http://nginx.org/packages/mainline/ubuntu trusty nginx

ちなみに、「trusty」とある部分はUbuntuのバージョンによって変わります。
詳しくはこちら

次に、

remew@vps~$ sudo apt-get update
remew@vps~$ sudo apt-get install nginx

インストールができたら、nginx -vとかやってバージョンを確認します。今回はnginx version: nginx/1.9.9と表示されてそのあとの行にもずらずら表示されました。

じゃあ次はLet's Encryptのインストールをしたいのですが、その前にほんの少しだけ説明します。

Let's Encryptとは

Mozillaとかの有名企業が立ち上げた団体と、そこが作ったプログラムです。(あってる?)

これを使うと、これまで有料だったり、無料でも手間がかかったりしたようなhttpsへの対応がめっちゃ簡単にできるという凄いものです。

これであなたもセキュアなワールド・ワイド・ウェブに仲間入りです!

Let's Encryptのインストール

まずgitが必要ですのでインストールされているか確認してください。

gitがあれば、git clone https://github.com/letsencrypt/letsencryptソースコードを引っ張ってこれます。

remew@vps~$ git clone https://github.com/letsencrypt/letsencrypt
remew@vps~$ cd letsencrypt
remew@vps~/letsencrypt$ ./letsencrypt-auto -help

最後のコマンドを打ったあと、sudo時のパスワードを入力すると、apt-getやらが走って色々ダウンロードするらしいです。こわ。

そしてヘルプが表示されたりほげほげ。

次に、

remew@vps~/letsencrypt$ ./letsencrypt-auto certonly --webroot -d [httpsに対応させるドメイン] --webroot-path [nginxで設定したドキュメントルート]

というコマンドを打ちます。(httpsに対応させるサブドメイン複数ある場合は、-d [ドメイン1] -d [ドメイン2]といった感じで書きます。自分はwwwありなしの2つでやりました)

コマンドを打つと、次のような画面が出てきます。 f:id:Foolish_OkNCT:20160103012601p:plain メールアドレスを入力しろということなので入力して< OK >でエンターを押すと次の画面になります。利用規約に同意してねって感じ f:id:Foolish_OkNCT:20160103012703p:plain < Agree >でエンター。

そしたら・・・ f:id:Foolish_OkNCT:20160103013356p:plain ・・・?

次何をしたらいいの?

実は既に証明書の発行は済んでおり、(画像では隠してあるんですが)記述されたパスに証明書が配置されています!
ちなみに、証明書の期間は3ヶ月らしいです。更新を忘れると悲しいことになるので注意しましょう。

この証明書をnginxの設定で読めばOK, your web site will be https.

めっちゃ簡単すぎてびっくり。

あとでサブドメイン追加したいってなったときはさっきのコマンドをまた打って、打つときにサブドメインも書き足してやればいい感じです。

つまり最初「remew.net」だけhttps化するなら、

./letsencrypt certonly --webroot -d remew.net --webroot-path [ドキュメントルートのパス]

とコマンドを打ち、あとで「www.remew.net」もhttps化したいと思ったならば、

./letsencrypt certonly --webroot -d remew.net -d www.remew.net --webroot-path [ドキュ(ry

という感じです。

もう既に文章書くのがつらいし読む人もつらそうな分量になってきましたが、あともう少しで終わるのでもう少し頑張ってください。

httpsに対応させてSSL LabでA+評価を獲得する

てかSSL Labってなんだよって人はこちら

表示されたページに評価したいドメインを入力します。すると、そのドメインhttpsがどれだけセキュアかを判定してくれます。

そうです、単にhttpsにするだけではダメなんですね。nginxの設定を頑張らないといけません。

まぁこれは先人の知恵をお借りしました。

参考にしたのはこちらのページです。ぜひご覧ください。

まぁ概ね上のページの設定を真似てるんですが、いくつか違う点もあるので紹介します。

ssl_protocols

これ、nginx1.9.9だと何も設定しなくてもSSLv3以下を切ってくれるっぽいので特に何も書いてないです。

ssl_ciphers

こちらの「Modern compatibility」のセクションにある「Ciphersuite」をコピペしました。

Modern compatibilityだとTLSv1も切っているのですが、それだとIE10とかAndroid4.3以下がつらいので一応含めています。

せっかくなのでhttps関連のnginxのconfファイルを記述します。

server {
    listen 443 ssl;
    server_name remew.net default_server;

    ssl_certificate [ちょっと前に書いた証明書のパス];
    ssl_certificate_key [上の証明書と同じディレクトリにあるprivkey.pem];

    ssl_prefer_server_ciphers on;
    ssl_ciphers (略)

    ssl_session_timeout 10h;
    ssl_session_cache builtin:1000 shared:SSL:10m;
    ssl_dhparam [dhparamファイルのパス];

    add_header Strict-Transport-Securiy 'max-age=15724800; includeSubDomains;';

    [locationとか]
}

ちなみに、add_header (後略)の部分がないとA+にならないらしいですが、これがあるとhttpsじゃないと該当ドメインにアクセスできなくなります。

dhparamファイルはてきとうにsudo openssl dhparam 2048 -out [dhparamファイルの配置先]とかやれば作れます。作るのに数分かかります。

A+判定もらうのにハマったところ

www.remew.netからremew.netにリダイレクトする設定を書いていたのですが、wwwアリの方の設定もちゃんとやってなかったのでしばらくA+がもらえなくて悩んでいました。

ですが、両方共同じような設定にしてwwwの方だけリダイレクトにする設定をすることで、なんとかA+判定がもらえました!! f:id:Foolish_OkNCT:20160103015323p:plain ↑タブ開きまくりおじさんのA+判定記念写真

http2対応

これは楽です。というかhttps対応のついででもいいでしょう。

nginxのconfファイルにたった6文字追加します。

server {
-   listen 443 ssl;
+   listen 443 ssl http2;
    (以下略)

わーい、http2で通信できるようになったよ!

http2だとアドレスバーに青いイナズマが出てくる拡張機能を入れて自分のサイトを見てみました。 f:id:Foolish_OkNCT:20160103015653p:plain 文字がいい感じにボタンとかぶっててダサいですが、そこじゃなくてアドレスバーを見ましょう!青いイナズマが出ています!

見づらいですが、デベロッパツールのProtocolの部分もh2、つまりhttp2になっています!!!!!!最高!!!!!!!!!!!

これで、remew.nethttps化できてhttp2にも対応できました。

ちなみに、「http://remew.net」「http://www.remew.net」「https://www.remew.net」の3つとも「https://remew.net」にリダイレクトされます。次回はこの設定でも書きましょうかね・・・

感想羅列

  • Let's Encrypt神っぽい
  • SSL LabでA+判定もらうのめんどくさかった
  • ちょっと新しいことやってる感じがして楽しかった。
  • Let's Encryptめちゃくちゃ楽だし流行って欲しい。

感想

Let's Encryptは団体が設立された頃から目をつけていて、早く使えるようにならないかな〜と思っていたのですが、12月の頭にオープンベータとなり今回試すことができてよかったです。

今後、httpsは必須となっていくと思います。そんな中、こんなにも簡単にhttps用証明書が得られるLet's Encryptは非常に優れたサービスだと感じました。

正直言って個人で建ててるサイトをhttps化したところでって感じはありますが、この体験をみなさんに伝えることで「こんなに簡単なんだ!自分もやってみよう!」と思ってくれる人が現れたら嬉しいなぁという気持ちです(まぁ銀行サイトなど非常に高度なセキュリティを要するところには使うべきではないのですが)。

ちなみに、Let's EncryptはApacheだと設定ファイルも自動的に書いてくれるらしく、たしかnginxもそのうち対応されるはずなので将来的にはこの記事の一部は必要なくなるんじゃないかと思います。もしそうなれば、https対応はさらに楽になるのでLet's Encryptさんにはぜひとも頑張って欲しいです。

ここまで読んでくださった方、ありがとうございます。
めちゃくちゃ長い記事を書くのつらかったです。多分1ヶ月分の文章書いた気がする。お疲れ様でした。