Heroku / 無料でサイトをSSL化してルートドメインも使用できるようにする

Shunsuke Sawada

結論

CloudFlareでやります。
あと、無料と書きましたが Heroku の無料DynoではSSL化できません。ので、サイト自体の運営にはUS$8くらいかかるのかな。SSL化は無料です。

経緯

AWS Route53とS3でルートドメイン対応していたけども、
そろそろSSL化せねばということで頑張ったけど、なんかできなかった。

Herokuのルートドメインに関しての公式記事はこちら
https://devcenter.heroku.com/articles/apex-domains

いくつか候補があるけど、使ったことのある CloudFlare でやってみた。

手順

まず、前提として heroku のSSLは使いません。
HerokuもAddonなしでSSL対応が簡単になっているんだけど、やはりルートドメインには対応できていない。 www.my-domain.com とかで良いケースではかなり簡単でありがたいけどね。
今回は https://my-domain.com でアクセスしたかったので、Herokuのお手軽SSLは使えない。


サイト登録

何はともあれ、とりあえず自分のドメインを登録。
Screen_Shot_2018-08-31_at_13.43.35

  
一番左の無料プランを選択。
Screen_Shot_2018-08-31_at_13.45.31

  
すでにDNSが設定されている場合はこんな感じで自動的にレコードつくってくれる。便利すね。今回はRoute53の設定値を引き継ぎたいのでとても楽です。
Screen_Shot_2018-08-31_at_13.46.46

  
ただ、すべてこのままで良いわけではないので注意。
下記のように修正します。

1
2
3
- Aレコード削除
- CNAME追加 `www` => `my-domain.herokuapp.com`
- CNAME追加 `@` => `my-domain.herokuapp.com`

my-domain.herokudns.com ではなく my-domain.herokuapp.com らしい。
Herokuがデフォルトで用意してくれるドメインですね。

CNAMEは本来ルート(@)は使えないんですが、CloudFlare では CNAME flattering というものが適応されて、ルートも CNAME のように振る舞うことができるらしい。

  
Screen_Shot_2018-08-31_at_13.56.37
もしかしたら最初は雲のマークがグレーになっているかも。
2つのCNAMEのステータスがオレンジ色になるように、雲マークをクリックしましょう。

  

DNS切り替え

Screen_Shot_2018-08-31_at_13.58.11

と、こんな感じにDNSを変えろと言われます。
ドメインを購入したサイトにログインして、ドメインの設定画面からDNSを変更しましょう。
ムームードメインだとこんな感じ。
Screen_Shot_2018-08-31_at_14.16.30

  
DNSの変更には時間がかかります。
24時間とか48時間とか言われますが、だいたい30分くらいで変更される印象。 と思ったらこのブログ書きながら行った作業では1日待たされた。。。
https://mgt.jp/t/dns# こちらとかを使わせてもらって確認してみましょう。

  
切り替わったら Overview メニューにいって、Recheck Nameserver ボタンを押します。これをしないと多分SSL証明書がつくれないはず。
Screen_Shot_2018-08-31_at_17.20.55

うまくいくと、下のような画面になります。
Screen_Shot_2018-08-31_at_17.21.06

  

SSL証明書作成

DNSが切り替わって、なおかつステータスがActiveになってからでないと、
CloudFlareで証明書が作れないっぽいので注意。
ドメインの所有権が確認できてないので当然か。

DNSが切り替わったら、ページ上部にある Crypto メニューを選択。
ちなみに先程のレコードを編集する画面は DNS メニューから行けます。
Screen_Shot_2018-08-31_at_14.02.01

  
Origin Certificates のセクションで Create Certificate をクリック。
Screen_Shot_2018-08-31_at_14.05.59

  
オプションはそのままでOK。

1
2
3
4
- Let Cloudflare generate a private key and a CSR
- RSA
- 15 Years 
- ルートドメインとワイルドカードサブドメイン

Screen_Shot_2018-08-31_at_14.08.16

そして Next ボタンを押す。

DNS切り替え前だと、下記のようなエラーが出ます。

1
Failed to validate requested hostname *.workabroad.jp: This zone is either not part of your account, or you do not have access to it. Please contact support if using a multi-user organization. (Code: 1010)

成功すると、Certificate と Private Key が取得できるので、
この画面を開いたまま、HerokuのSettingsを開きます。

Configure SSL を選択して Manually configure using my own certificate を選択。
CloudFlareで取得した Certificate と Private Key をそれぞれ貼り付けます。

Screen_Shot_2018-08-31_at_17.29.19
Screen_Shot_2018-08-31_at_17.29.31

  
ここでエラーになる時は、DNSが完全に切り替わってないかもしれません。
しばらく時間をおいて試してみましょう。

  
しばらくまって、DNSが切り替わってもエラーになる場合があるみたい。
その場合は下記のコマンドでアップしてみると良いかもです。
※ Heroku CLIツールのインストールが必要

bash
1
2
3
4
$ heroku certs:add /path/to/my_certificate.pem /path/to/my_private.key -a my-app

# アップされたかどうか確認する
$ heroku certs:info -a my-app

  
Herokuの管理画面がこうなったらOK。
Screen_Shot_2018-09-01_at_17.05.04

  

Always Use SSL

Herokuに証明書を登録できたら、CloudFlare に戻って 再度 Crypto メニューに行き、Always Use SSL オプションを ON にします。
Screen_Shot_2018-09-01_at_10.11.21

  

Automatic HTTPS Rewrites

もし http と https 混合のサイトになっている場合は、このオプションを有効にしておくと良いかもです。手作業でやると大変ですからね。
Screen_Shot_2018-09-01_at_18.13.53

  

Page Rules

ここまでで普通は終わりですが、
このブログでは image.workabroad.jp を AWS S3 に向けていたので、Page Rule の設定を行いました。
こんな感じで良いと思います。
Screen_Shot_2018-09-02_at_11.37.16

  
以上です。
AWS と Heroku だけじゃ完結しなくなっちゃいますが、仕方ないですね。
簡単ですし、証明書の更新も15年いらないので楽。

Shunsuke Sawada

おすすめの記事

SSLにしたらCakePHPでfaviconが表示されなくなった。
SSL使う時javascriptの読み込みで気をつけるのはhttp://だけじゃなかった…と思ったけどそうじゃなかった。
1
RubyonRailsをApacheとPassengerで動かす