Herokuの公式ドキュメントを読むとSSLを導入する方法は
の3種類がありますが、Automated Certificate Management (ACM)にすると
というメリットから、アドオンで提供されていたHeroku SSL Endpoint から移行してみました。
移行の際、一旦Heroku SSLに移行してからでないとダウンタイムが発生してしまうということで
のように2段階に分けて移行を行いました。
具体的な手順は公式の以下のページを参照しました。
Heroku SSL | Heroku Dev Center
- ①Heroku SSL Endpoint => Heroku SSL 移行
- ②DNSのCANME変更
- ③Heroku SSL => Automated Certificate Management(ACM) 移行
①Heroku SSL Endpoint => Heroku SSL 移行
既存のSSL証明書の用意
まずは、SSL Endpointに登録したものと同じSSL証明書、秘密鍵を用意します。
ここでは
とします。
Heroku SSLに証明書と秘密鍵を追加
以下のようにHerokuコマンドを実行して、Heroku SSLに証明書と秘密鍵を追加します。
$ heroku certs:add example.crt example.key --type sni -a 【project-name】
SNIは、Heroku SSLが使っているTLS protcolを拡張したもののようです。
Behind the scenes Heroku SSL uses Server Name Indication (SNI), an extension of the TLS protocol, which is widely supported in modern browsers.
SSL証明書の追加確認
Heroku SSLに証明書が追加されたことを確認します。2つ目のようにTypeがSNI
で追加されていればOKです。
$ heroku certs -a 【project-name】 Name Endpoint Common Name(s) Expires Trusted Type ────────────────── ──────────────────────── ──────────────────────── ────────── ********** **********.herokussl.com ********** 2020-03-26 01:20 UTC True Endpoint ********** (Not applicable for SNI) ********** 2020-03-26 01:20 UTC True SNI
DNS targetの確認
次にDNSに設定するtargetを確認します。***.herokudns.com
のようなエンドポイントが表示されます。
$ heroku domains -a 【project-name】 === pplog Heroku Domain ***.herokuapp.com === pplog Custom Domains Domain Name DNS Record Type DNS Target ───────────── ─────────────── ─────────────────────────── ********** CNAME ***.herokudns.com
②DNSのCANME変更
次にDNSの設定画面を開いてCNAMEを変更します。
現状*****.herokussl.comのようなエンドポイントになっているところを新しいエンドポイントに変更します。
digコマンドで、エンドポイントが****.herokudns.comのように切り替わっていることを確認します。
$ dig CNAME 【domain】 ;; ANSWER SECTION: *********.com. 3408 IN CNAME ***.herokudns.com.
DNS設定変更後、24時間後に③のオペレーションを行います。
③Heroku SSL => Automated Certificate Management(ACM) 移行
SSL Endpointアドオンを削除する
$ heroku addons:destroy ssl -a 【project-name】
Automated Certificate Management有効化
$ heroku certs:auto:enable -a 【project-name】
ACMの設定確認
ACMが有効になることを確認します。
heroku certs:auto -a 【project-name】 === Automatic Certificate Management is enabled on 【project-name】
再度、証明書も確認し、TypeがACM
になっていればOKです。
$heroku certs -a 【project-name】 Name Common Name(s) Expires Trusted Type ────────────────── ──────────────────────── ──────────────────────── ────────── ********** ********** 2020-06-29 05:30 UTC True ACM