Heroku SSL Endpoint から Automated Certificate Managementへ移行してみた

Herokuの公式ドキュメントを読むとSSLを導入する方法は

  • Automated Certificate Management (ACM)
  • Heroku SSL
  • SSL Endpoint

の3種類がありますが、Automated Certificate Management (ACM)にすると

  • Let's EncryptのSSL証明書を自動更新してくれるので、手動更新が不要になる
  • SSLが無料になる

というメリットから、アドオンで提供されていたHeroku SSL Endpoint から移行してみました。

移行の際、一旦Heroku SSLに移行してからでないとダウンタイムが発生してしまうということで

  • Heroku SSL Endpoint => Heroku SSL 移行
  • Heroku SSL => Automated Certificate Management(ACM) 移行

のように2段階に分けて移行を行いました。

具体的な手順は公式の以下のページを参照しました。
Heroku SSL | Heroku Dev Center

①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を変更します。

f:id:moritamorie:20200420012200p:plain

現状*****.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