Automated Certificate Management
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2024年04月24日(水)
Table of Contents
Heroku の Automated Certificate Management (ACM) 機能により、Common Runtime のアプリと、この機能を有効にしている Private Space 内のアプリの TLS 証明書が自動的に管理されます。
ACM によって処理される証明書は、有効期限が切れる 1 か月前に自動的に更新されます。また、カスタムドメインを追加または削除するたびに、新しい証明書が自動的に作成されます。すべてのアプリケーションには ACM が無料で含まれています。
Automated Certificate Management では、自動化された無料かつオープンの認証局である Let’s Encrypt を使用して、アプリケーションの TLS 証明書を管理します。Let’s Encrypt は、Internet Security Research Group (ISRG) によって公益目的で運営されています。
セットアップ
Common Runtime
次のコマンドで ACM を有効にします:
$ heroku certs:auto:enable
ACM を有効にするときは、DNS がその新しい DNS ターゲットを指していることを確認してください。*.herokuapp.com
または *.herokussl.com
を指している場合、Heroku で証明書を検証できません。DNS ターゲットを検証するには、heroku domains
を実行します。
Private Space
アプリに現在 TLS 証明書がない場合は、ACM を有効にして、証明書がプロビジョニングされるのを待つだけです。
$ heroku certs:auto:enable
すでに手動で TLS 証明書をアップロードしている場合、ACM に移行するには、次の手順に従います。
1. 手動でアップロードした証明書の名前を確認する
$ heroku certs
Name Endpoint Common Name(s) Expires Trusted Type
──────────── ─────────────────────────────────────────────────────── ────────────────────── ──────────────────── ─────── ─────────────────
nagano-91606 <haiku>.<haiku>.herokuspace.com <common-name> 2018-08-13 11:05 UTC True SNI
2. アプリで ACM を有効にする
$ heroku certs:auto:enable
Enabling Automatic Certificate Management... done
=== Your certificate will now be managed by Heroku. Check the status by running heroku certs:auto.
3. ACM 証明書が発行されるのを待つ
必ず、この処理が完了するまで待ってから次に進んでください。これを守らないと、アプリでダウンタイムが発生する可能性があります。
$ watch heroku certs:auto
4. 手動で追加した証明書を削除する
手順 1 で確認した証明書の名前を指定します。
$ heroku certs:remove --name nagano-91606
証明書のステータスを表示する
アプリのカスタムドメインの TLS 証明書が生成されるまで、通常 45 ~ 60 分かかります。次のコマンドを実行すると、生成された証明書のステータスを表示できます。
$ heroku certs:auto
証明書のステータスが Cert Issued
になったら、プロセスは完了です。
証明書のステータスが DNS Verified
の場合、プロセスはまだ完了していません。Heroku はドメインのステータスを検証しましたが、まだ証明書を Let’s Encrypt に送信する処理の途中です。
次に示すのは、可能性がある証明書生成ステータスの一覧です。
ステータス | 説明 |
---|---|
Cert Issued | ドメインに対して証明書が発行されました。 |
In Progress | Heroku はカスタムドメインの DNS を検証しています。 |
DNS Verified | Heroku はカスタムドメインの DNS の検証を終え、証明書の生成処理中です。 |
Waiting | Heroku は現在、証明書の処理を待っています。 |
Failing | Heroku は DNS を検証できません。最大で 1 時間検証を続けます。このエラーへの対処方法については「トラブルシューティング」を参照してください。 |
Failed | Heroku は DNS を検証できません。このドメインの検証を中止しました。このエラーへの対処方法については「トラブルシューティング」を参照してください。 |
独自の TLS 証明書の提供
別の CA の証明書、ワイルドカード証明書、EV 証明書など、異なる種類の TLS 証明書を使用することも容易です。
「Heroku SSL」で説明している手順に従って、独自の証明書をアップロードするだけです。
独自の証明書を提供すると、アプリケーションで ACM が無効になります。ACM を再び有効にする場合は、次のコマンドを実行できます。
$ heroku certs:auto:enable
Automated Certificate Management をオフにする
ACM をオフにしてすぐにオンに戻すことはしないでください。Let’s Encrypt でアカウントが速度制限に達する可能性があるためです。
次のコマンドを実行すると ACM をオフにできます。
$ heroku certs:auto:disable
ドメインの証明書が削除され、アプリケーションで ACM がオフになりま す。heroku certs:remove
で証明書を削除すると、ACM もオフになります。
既存のアプリケーションの移行
独自の証明書を使用して Heroku SSL および Private Space から移行する
Automated Certificate Management では、Heroku SSL (SNI) サポートと同じ DNS 設定を使用します。Private Space アプリで ACM を有効化する場合でも、DNS の変更は必要ありません。DNS 設定の検証には少し時間がかかる場合がありますが、検証の進行中、アプリでは既存の SSL 証明書が引き続き提供されます。プロセスの最初から最後まで、アプリはカスタムドメインで利用可能な状態です。
トラブルシューティング
ACM プロセスを修正または高速化する目的で ACM をオフにしないでください。Let’s Encrypt でアカウントが速度制限に達する可能性があるためです。
検証エラー
いずれかのドメインで heroku certs:auto
が Failing
または Failed
を示している場合、Heroku はそのドメインで DNS を検証できませんでした。heroku domains
で指定されている正しい DNS ターゲットを DNS が指していることを確認する必要があります。DNS ターゲットは <your-domain>.herokudns.com
の形式になります。
*.herokuapp.com
や *.herokussl.com
などの古い DNS 設定を DNS が指している場合、Heroku は証明書を生成できません。
ACM がドメインに対して証明書を作成できない場合、3 日間の試行後に通知が届きます。このエラーが発生するのは、ほとんどの場合、ドメインに対して DNS が適切に設定されていないからです。 DNS の問題を解決したら、次のコマンドを実行して ACM に再試行を指示します。
$ heroku certs:auto:refresh
失敗の理由
証明書の発行が失敗する理由はいくつかあります。通知メールまたは CLI で失敗の理由を確認できる場合があります。
64 文字の制限を超える CN
ドメイン名は 64 文字を超えてはなりません。
正しくない DNS 設定
DNS レコードが正しく設定されていません。
このドキュメントの内容を再確認し、DNS レコードが正しく設定されていることを確認してください。
ドメインが DNSSEC (DNS Security Extensions) 検証に失敗した場合、このエラーが発生することがあります。
Private Space アプリで web
dyno が実行されていない場合にも、このエラーが発生することがあります。
ドメインの DNS を解決できない
このエラーは通常、DNS 名がまだ DNS プロバイダーまで伝播していない場合に発生します。Heroku の ACM 機能では、ドメインの可用性を Google の DNS (8.8.8.8
) でチェックします。
ドメインが Google Public DNS で利用可能で、入力ミスがないことを確認してください。
CDN が HTTP チャレンジを返さない
HTTP チャレンジ ファイルが返されることを Heroku ACM で検証中に 404 エラーが発生しています。これが発生するのは通常、ドメインが Heroku によって提供される DNS ターゲットではなく CDN を指しており、HTTP チャレンジファイルが CDN に存在しない場合です。
これは通常、AWS CloudFront で発生します。
DNS リダイレクトでパスが転送されない
HTTP チャレンジファイルが返されることを Heroku ACM で検証していますが、DNS プロバイダーからファイルの場所の完全なパスが返されません。
使用中の DNS プロバイダーがパスの転送をサポートしていない場合、DNS プロバイダーの変更が必要な可能性があります。Google Domains などの一部のプロバイダーでは、パス転送をオンまたはオフにする機能を提供しています。Google Domains では、デフォルトでこれが “オフ” になっています。
正しくない CNAME ターゲット
このエラーが発生するのは、DNS レコードで、提供された DNS ターゲットではなく CNAME のターゲットとして <app-name>-<random-identifier>.herokuapp.com
を指定した場合です。正しい DNS ターゲットを指すように DNS レコードを更新してください。
正しい DNS ターゲットを確認するには、heroku domains
を実行します。
速度制限
7 日間の期間中、このアプリのドメインに対する証明書発行リクエストが多すぎたため、ACM が失敗しました。この速度制限は Let’s Encrypt 側で設定されているため、Heroku サポートでは対処できません。アプリで ACM の有効化と無効化を繰り返すと、速度制限が発動する場合があります。
他のアプリのドメインの ACM はこのエラーの影響を受けない (アプリで速度制限が発生しても、使用ドメインが異なる別のアプリの ACM には影響しない) ことに注意してください。
速度制限期間が終了したら、次のように実行して証明書の再発行を試すことができます。
$ heroku certs:auto:refresh
DNS プロバイダーがタイムアウトした
Heroku で DNS レコードの検証を試みましたが、DNS プロバイダーがタイムアウトしました。heroku certs:auto:refresh
を実行して再試行してください。
CDN の Strict TLS はサポートされていない
Cloudflare で ACM の使用を試みていますが、正しく設定されていません。
Cloudflare により SSL 証明書が提供されるため、Heroku では Cloudflare で ACM を使用しないことをお勧めします。アプリで ACM を無効にするには、heroku certs:auto:disable
を実行します。
詳細は、Cloudflare と Heroku の HTTPS 設定に関する Cloudflare のドキュメントを参照してください。
DNS プロバイダーで CAA がサポートされていない
DNS プロバイダーで Certificate Authority Authorization (CAA) レコードがサポートされていないというエラーが Let’s Encrypt から返されました。
CAA サポートについての詳細は、DNS プロバイダーにお問い合わせください。CAA レコードの詳細も参照してください。
発行を妨げる CAA レコード
CAA レコードの内容が原因で、Let’s Encrypt で証明書を発行できません。
ドメインの証明書の発行を Let’s Encrypt に許可する CAA レコードを追加してください。CAA レコードの詳細も参照してください。
ドメインレコードが存在しない
Let’s Encrypt が NXDOMAIN エラーを返しました。これは、ドメインレコードが DNS プロバイダーに存在しないことを意味します。
このエラーを修正するには、ドメイン名が正しく入力されており、ドメインの DNS レコードに正しい CNAME が含まれていることを確認してください。
安全でないとみなされたドメイン
Let’s Encrypt は Google の Safe Browsing API に照らしてドメインをチェックし、安全でないとみなしたドメインの証明書は発行しません。
次の URL にアクセスしてドメインのステータスを確認してください: http://www.google.com/safebrowsing/diagnostic?site=http://yourdomainhere.com/
Let’s Encrypt のドメインブロックリスト
Let’s Encrypt のドメインブロックリストに登録されているドメインに対して証明書をリクエストしました。通常、不正な証明書の作成を防ぐための追加セキュリティ手段として、よく知られたドメインがこのブロックリストに含まれています。
コミュニティサポートフォーラムから Let’s Encrypt にお問い合わせください。
ACM の代替手段
ワイルドカード証明書の自動更新や別の CA の利用を希望する場合、SSL FastTrack や ExpeditedSSL などの Heroku アドオンがユースケースに適合する可能性があります。
Let’s Encrypt は Heroku および Salesforce から独立した組織であり、Heroku では、ドメインの SSL を取得するケースの大半で Let’s Encrypt の検証プロセスの統合と証明書のインストールを簡素化する ACM を提供しています。アプリまたはドメインでより高度な統合が必要な場合は、Let’s Encrypt を直接使用できます。また、取得した証明書を Heroku アプリに自動的にインストールするものなど、自社製およびサードパーティのさまざまな既製プラグインを使用して Let’s Encrypt を高度に自動化できます。その他の機能については、Let’s Encrypt サイトの資料を参照してください。
既知の制限
- カスタムドメインは 64 文字を超えてはなりません。
- ACM は証明書の手動管理を置き換えるものであり、1 つのアプリで両方を行うことはできません。
- ワイルドカードのカスタムドメインを持つアプリケーションは、ACM でサポートされていません。
- Private Space 内のアプリで信頼済み IP を使用してアクセスをブロックしていた場合、ACM はそのアプリで機能しません。
- 初期検証と更新が機能するためには、Private Space アプリで少なくとも 1 つの
web
dyno が実行中である必要があります。 - ACM が有効なとき、Let’s Encrypt の HTTP チャレンジ URL (
/.well-known/acme-challenge/*
) は Heroku Platform によって処理され、アプリからリダイレクトされます。アプリでこれらのパスを使用する必要がある場合、ACM を無効にする必要があります。 - ACM では IPv6 AAAA DNS レコードはサポートされていません。
- ACM は内部ルーティングと互換性がありません。