はじめに
この章では、本記事の目的と読み進め方をやさしく説明します。Heroku上で安全にウェブサイトを運用するために必要なSSL(TLS)設定と運用のポイントを、実務で役立つ形でまとめました。独自ドメインでの有効化方法、証明書の管理と自動化、トラブル対応、そして実際の設定手順まで網羅します。
この記事の目的
HerokuにデプロイしたアプリをHTTPSで安全に提供する方法を、初心者にも分かりやすく示します。実務で直面しやすい課題や選択肢(ACMを使うか手動で証明書を管理するか)について、メリットと注意点を整理します。
対象読者
- Herokuでアプリを運用している開発者や運用担当者
- 独自ドメインでHTTPS運用を始めたいサイト管理者
- SSL証明書の管理方法を見直したい方
基本的なドメインやDNSの知識があると読み進めやすいです。
読み進め方
章ごとに段階的に読み進めると理解が深まります。まずはSSLの基本とHeroku独自の仕組みを押さえ、その後で具体的な設定と運用のコツを確認してください。
HerokuにおけるSSL(TLS)とは
概要
SSL/TLSは、ブラウザとサーバー間の通信を暗号化して第三者からの盗聴や改ざんを防ぐ仕組みです。普段見る鍵マークやhttpsがそれに当たります。Herokuはこの仕組みを標準でサポートしており、利用者のアプリを安全に公開できます。
Herokuの既定の挙動
Herokuが提供する「*.herokuapp.com」ドメインは、すべて自動的にSSL/TLS化されています。つまり、アプリをデプロイするときに特別な設定をしなくても、Heroku側で暗号化された接続が提供されます。
独自ドメインとの違い
独自ドメインを使う場合は、追加でSSL証明書の適用や設定が必要になります。Herokuは自動で証明書を管理する機能(ACM)と、手動で証明書をアップロードする方法の両方を提供しています。どちらを使うかで管理の手間や柔軟性が変わります。
ユーザーにとってのポイント
- HTTPSによりユーザーの入力情報やクッキーが安全に送信されます。
- SEOやブラウザの警告回避のためにもHTTPSは重要です。
- 独自ドメインを使う場合は、設定の有無で接続の安全性が左右されます。
この章では、まずSSL/TLSの役割とHerokuでの基本的な振る舞いを理解しておくと、次の章での具体的な設定選択がわかりやすくなります。
独自ドメインでSSLを有効にする2つの方法
概要
HerokuでカスタムドメインにSSLを設定する方法は主に2つあります。1つはHerokuが証明書を自動で発行・更新するACM、もう1つは自分で取得した証明書をアップロードして管理するHeroku SSL(カスタム証明書)です。
1. ACM(Automated Certificate Management)
- 特長:HerokuがLet’s Encrypt等を使って無料で証明書を発行し、自動で更新します。手作業による証明書管理が不要です。
- 利点:設定が簡単でコストがかかりません。ほとんどの一般的なウェブサイトに十分対応します。
- 注意点:OV/EVなどの企業向け証明書や、特殊なCAが発行する証明書を使いたい場合は対応しません。DNSはHerokuの指示に従ってCNAMEやルート用のエイリアス設定が必要です。
2. Heroku SSL(カスタム証明書アップロード)
- 特長:自分で取得した証明書(と秘密鍵)をHerokuにアップロードして使います。
- 利点:ワイルドカード証明書やOV/EV証明書など、用途に応じた証明書を使えます。企業ポリシーや特定のCAを指定したい場合に有効です。
- 欠点:有料のプランが必要で、証明書の更新は手動です。更新忘れによる期限切れに注意してください。
選び方の目安
- 個人サイトや一般的なサービス:まずACMを使うと手間が少なく安全です。
- 企業向け、高度な証明書が必要:Heroku SSLで独自証明書を使うと柔軟性があります。
導入の概略手順
- Heroku側でカスタムドメインを登録する。2. DNSでHerokuが指示するレコードを設定する。3-1. ACMを選ぶ場合は有効化を待つ。3-2. カスタム証明書の場合は証明書と秘密鍵をアップロードして有効化する。
用途と運用コストを比べて、適した方法を選んでください。
ACM(Automated Certificate Management)利用のポイント
概要
ACMはHerokuが提供する自動証明書管理機能です。証明書の発行・更新を自動化するため、ほとんどの一般的なWebアプリに向いています。手動での証明書更新作業を大幅に減らせます。
利点
- 証明書の有効期限管理が不要になります。Heroku側で自動更新します。
- 設定は簡単で、ダッシュボードやCLIから有効化できます。
- 中小規模のサービスで手間を減らし、運用コストを下げます。
DNS設定の例
カスタムドメインを追加すると、HerokuはDNSターゲット(例: example.com.herokudns.com)を返します。DNS側では次のように設定します。
– サブドメイン: CNAMEでexample.com.herokudns.comを指す。
– ルートドメイン(apex): DNSプロバイダのALIAS/ANAME機能を使い、example.com.herokudns.comを指す。
DNS反映後にACMが証明書を発行します。発行まで数分〜数時間かかることがあります。
制限事項
- ワイルドカード証明書は部分的に対応しますが、すべてのケースで期待通り動かないことがあります。OV/EV(企業認証)証明書はサポートしません。
- 内部ルーティングやプライベートスペース経由のドメインでは利用できない場合があります。
- 特殊な要件(組織名表示など)がある場合は、カスタム証明書のアップロードを検討してください。
運用のポイント
- ACMを有効化したら、DNSターゲットが正しく設定されているか確認してください。
- 発行状態はHerokuダッシュボードやCLI(heroku certs:auto)で確認できます。
- カスタム要件や高度な監査が必要な場合は、手動証明書運用を選びましょう。
Heroku SSL(カスタム証明書アップロード)の特徴
概要
Herokuのカスタム証明書アップロードは、組織認証(OV/EV)やワイルドカード証明書を使いたい場合、内部ルーティング環境で独自の証明書を管理したい場合に使います。ACMが自動で発行・更新できない証明書を自分で用意してアップロードする方式です。
主な特徴と利点
- OV/EVやワイルドカードが使える:例えば「*.example.com」を含む証明書をそのまま使えます。
- 証明書チェーンと秘密鍵を自分で管理:PEM形式の証明書チェーンと秘密鍵を用意してアップロードします。これにより、企業ポリシーに沿った証明書運用が可能です。
- 内部ルーティングに対応:内部ドメインや専用ネットワーク経由での運用が必要なケースで柔軟に使えます。
DNS設定の例
ワイルドカード用のDNSターゲットとして、Herokuが指示する指定先(例:wildcard.example.com.herokudns.com)を使います。DNSではCNAMEやALIASをそのターゲットに向けます。ルートドメインではALIAS/ANAMEが必要な場合があります。
実務上のポイント
- 証明書はPEM形式で、秘密鍵と中間証明書を含めて用意します。
- コマンドやダッシュボードで”証明書の追加”を行い、検証後に反映します(CLI例:heroku certs:add)。
- 有効期限の管理は手動です。期限が来る前に再発行・再アップロードしてください。
- 秘密鍵は厳重に保管し、漏洩しないように運用します。
カスタム証明書は自由度が高く強力ですが、その分、管理と更新の手間がかかります。必要に応じてACMと使い分けることをおすすめします。
HerokuにおけるSSL/TLSの技術的ポイント
SNI(Server Name Indication)
HerokuはSNIを用いており、同一IPで複数ドメインの証明書を扱えます。これにより、1つのルーターIPで複数のアプリやカスタムドメインを安全に運用できます。例:example.comとapi.example.comで別々の証明書を割り当てられます。
TLSのバージョンと暗号スイート
HerokuのエッジでTLSを終端します。一般にTLS1.2以上を使うようにし、サーバー側の安全な暗号スイートを優先します。クライアントは古いTLSを避け、最新ライブラリを使って接続してください。
証明書検証(クライアント側)
Heroku PostgresやRedisはSSL接続を推奨します。接続文字列やライブラリでsslmodeやverifyオプションを設定し、可能ならCA検証(verify-full)を使います。例:psqlでは”sslmode=verify-full”を設定します。
証明書の適用場所と更新
ACMなら自動更新されますが、カスタム証明書をアップロードする場合は期限管理が必要です。更新忘れを防ぐため自動化や通知を用意しましょう。
実運用での注意点
アプリ側でHTTP→HTTPSリダイレクトやHSTSを設定すると安全性が高まります。内部サービスやライブラリがTLSを正しく扱えるか定期的に確認してください。
SSL証明書管理の自動化とセキュリティ維持
自動化の利点
ACMなどを使うと、証明書の発行・更新を自動化できます。期限切れや手動更新のミスを防ぎ、運用負荷とリスクを大幅に下げます。自動化は小規模チームでも安全な運用を可能にします。
運用フローの例
- ドメインをHerokuに追加してDNS検証を行う。 2. ACMにより証明書を発行・プロビジョニング。 3. Herokuが自動で証明書を適用・更新。
定期的にDNS設定や所有権の状態を確認してください。
監視とアラート
自動化しても監視は必須です。証明書状態、TLSハンドシェイクエラー、失効リストの通知を外部モニタで監視し、異常時にメールやチャットへアラートを出すと安全です。
HTTPヘッダーでの追加防御
- HSTS: max-ageを短めから段階的に伸ばし、includeSubDomainsやpreloadは慎重に設定します。
- Public-Key-Pins: 運用が難しいため基本は推奨しません。鍵紛失時の影響が大きい点に注意してください。
- Content-Security-Policy: 外部スクリプト読み込みを制限し、XSSリスクを下げます。
その他にX-Frame-Options、X-Content-Type-Options、Referrer-Policyも有効です。
運用上の注意点
カスタム証明書を使う場合は秘密鍵の保管とバックアップを厳重に行い、鍵のローテーション手順を文書化してください。自動化の権限は最小権限にし、テスト環境で変更を検証してから本番へ反映します。証明書発行のレート制限にも注意しましょう。
トラブルや注意点
よくある原因
- DNS設定が間違っている(CNAMEやALIASが正しいか、Aレコードが誤っていないか)。
- 証明書の有効期限切れやチェーンの不備(中間証明書が抜けている)。
- ACMのステータスが「発行中」や「失敗」になっている。
確認手順
- DNSの反映を確認します。プロバイダの管理画面で設定を再確認し、反映には最大24〜48時間かかる点に注意します。
- 証明書の有効期限を確認します。ブラウザの鍵アイコンやopenssl、外部チェックツールで確認できます。
- HerokuダッシュボードのSSLページでACMやカスタム証明書の状態を確認します。エラーが出ていればログを確認します。
ワイルドカードや特殊証明書
ワイルドカードや特別な拡張が必要な場合は、ACMでは対応できないことがあります。その場合はHeroku SSL(手動アップロード)を使って証明書と秘密鍵、必要なら中間証明書をアップロードしてください。
DB接続時の注意
PostgresやRedisなどは接続時にSSLを有効にする必要があります。例:PostgresはPGSSLMODE=require、Redisはrediss://を使うなど、クライアント側の設定を忘れないでください。
その他の注意点
- HTTPからHTTPSへリダイレクトが正しく設定されているか確認します。混在コンテンツ(HTTPのリソース)があると警告が出ます。
- 証明書の自動更新が失敗した場合の監視ルールを用意します。
参考:HerokuでのSSL設定の具体例・手順
以下はダッシュボードとHeroku CLIの両方で行える代表的な手順です。状況に合わせて使ってください。
1. カスタムドメインの追加
- ダッシュボード:アプリ > Settings > Domains and certificates > Add domainでドメインを追加します。
- CLI:heroku domains:add www.example.com –app your-app-name
- 追加後、Herokuが提示する「DNS Target(CNAME)」を控えます。
2. DNS設定
- サブドメイン(例:www)はCNAMEでHerokuのDNS Targetを指します。
- ルートドメイン(例: example.com)はDNSプロバイダのALIAS/ANAMEやAレコード(プロバイダが指定する方法)で設定します。
- 設定後、DNS反映を待ちます(通常数分〜数時間)。
3. ACM(自動管理)を使う場合
- ダッシュボード:Settings > CertificatesでACMを有効化します。
- CLI:heroku certs:auto:enable –app your-app-name
- 有効化後、Herokuが証明書を自動発行・更新します。発行状況はダッシュボードかCLIで確認できます。
4. 手動で証明書をアップロードする場合
- 証明書と秘密鍵を用意します(PEM形式)。中間証明書を含めた完全なチェーンを用意してください。
- ダッシュボード:Settings > SSL Certificates > Upload certificateでアップロードします。
- CLI:heroku certs:add fullchain.pem privkey.pem –app your-app-name
- アップロード後、ドメインに証明書が割り当てられていることを確認します。
5. 動作確認
- ブラウザで https://your-domain を開き、証明書情報を確認します。
- CLIで確認:curl -I https://your-domain
- 詳細な診断はSSL Labs(外部サービス)などを利用します。
6. 更新と注意点
- ACMは自動更新されます。手動証明書は期限切れ前に再発行して再アップロードしてください。
- DNSが正しく設定されていないと証明書発行やHTTPS接続が失敗します。
まとめ:HerokuでSSLを安全・効率的に運用するために
HerokuでHTTPS運用を安定させるための要点を、実務向けに分かりやすく整理します。
基本方針
- 一般的な用途ではACM(自動証明書管理)を使ってください。無料で自動更新され、運用負荷を大きく下げます。
- 特殊なワイルドカードや独自要件がある場合は、Heroku SSL(証明書手動アップロード)を選びます。鍵の管理や更新を自分で行う必要があります。
運用チェックリスト
- HTTP→HTTPSを常時リダイレクトする。
- HSTSを設定してブラウザ側の安全性を高める。
- DNS設定(CNAME/ALIAS)を正しく保つ。
- 証明書の有効期限と自動更新状況を定期的に確認する。
- 秘密鍵は安全な場所に保管し、アクセスを最小限にする。
セキュリティと信頼性
- Herokuのチームアクセス管理を利用して運用者を制限してください。
- ログと監視でTLS接続のエラーや古いプロトコルの使用を検出する。
- ステージング環境で更新を検証してから本番に反映する。
これらを実践すると、安全で効率的なHTTPS運用が実現できます。導入後も監視と定期的な見直しを続けてください。












