Let’s Encryptでsplapiをhttp/2に対応させた。

retrorocket.bizは強制的にhttpsで通信するようになっています。retrorocket.bizで試しに作ってるWebアプリがあって、そこから適当なAPIを呼ぼうと思ってJavaScriptからsplapiを呼んだらエラーになって自爆しました。SSL対応してないから当然ですね。
時代は常時SSLだし自爆したのでいい加減対応することにしました。
最初StartSSLで証明書を取得しようとしたのですが、手続きが心底めんどくさいのと、返事がめちゃくちゃ遅いのでLet’s Encryptでさっさと証明書を取得することにしました。

証明書の取得は以下のサイトを参考にしました。gitとPythonが必須です。CentOS 7では特に問題なく動作しました。
Let’s Encrypt サーバー証明書の取得と自動更新設定メモ | あぱーブログ
splapiはリバースプロキシにnginxを使っているので、webrootを使用しました。
nginx用のオプションもあるらしいのですが、指定するとnginx.confを書き換えるとかいうとんでもない仕様だったので自前で設定します。

nginxのほうですが、/.well-known/acme-challenge/は403を返すと認証がこけたので、404を返すように指定しました。

        location ^~ /.well-known/acme-challenge/ {
                root /var/www/acme;
        }

        location = /.well-known/acme-challenge/ {
                return 404;
        }

証明書の取得用に実行したコマンドは以下。

./certbot-auto certonly --webroot -w /var/www/acme -d splapi.retrorocket.biz

/.well-known/acme-challenge/配下に認証用のファイルを作って、 http://ドメイン名/.well-known/acme-challenge/hogehoge にアクセスし、認証が終わったらファイルを消す、という動作をします。
/etc/letsencrypt/live/配下にシンボリックリンクが作成されるので、あとはssl_certificateとかに作成された証明書のパスを設定するだけでOKです。
nginx再起動まで5分もかからずに終わったのでめちゃくちゃ爆速ですね。

ssllabsの判定はAでした。
結構きつめの設定にしてるのと、Let’s Encryptへの対応状況がよくわからないので使用しているライブラリによってはSSLでAPIが呼べないかもしれません。
少なくともChrome52でJavaScript実行した時にエラーが出ないので私はこれでいいです。