SSL エンドポイント
最終更新日 2023年06月14日(水)
This article is a work in progress, or documents a feature that is not yet released to all users. This article is unlisted. Only those with the link can access it.
Table of Contents
SSL エンドポイントアドオンは非推奨であるため、お客様によってプロビジョニングできなくなりました。既存の SSL エンドポイントは引き続き機能します。SSL エンドポイントは 2021 年 7 月 31 日より Heroku SSL に移行されます。SSL エンドポイントアドオンの最終的なシャットダウンの日付およびサポート終了は 2021 年 10 月 18 日です。SSL エンドポイントを使用中のお客様には詳細がメールで通知されます。すべての既存の Heroku アプリケーションおよび新しい Heroku アプリケーションでは、Automated Certificate Management (ACM) を含む Heroku SSL を使用する必要があります。
SSL は、すべての Web リクエストにエンドツーエンド暗号と整合性をもたらす暗号化プロトコルです。機密性の高いデータを転送するアプリでは、すべての情報を安全に転送できるように SSL を有効にする必要があります。
SSL を www.example.com
などのカスタムドメインで有効化するには、SSL エンドポイントアドオンを使用します。
SSL エンドポイントは有料のアドオンサービスです。サービスをプロビジョニングするときは、このことに注意してください。
SSL エンドポイントはカスタムドメインについてのみ役立ちます。すべてのデフォルトの <appname>-<random-identifier>.herokuapp.com
ドメインはすでに SSL に対応しているため https
を使用して、たとえば https://example-app-1234567890ab.herokuapp.com
のようにしてアクセスできます。
概要
SSL 検証に特有の性質により、アプリケーションに対する SSL のプロビジョニングは、いくつかのサードパーティを含む複数ステップのプロセスとなります。次のことを行う必要があります。
- SSL 証明書を SSL プロバイダーから購入する
- Heroku からSSL エンドポイントをプロビジョニングする
- 証明書を Heroku にアップロードする
- 新しい SSL エンドポイント URL を参照するように DNS 設定を更新する
SSL 証明書の取得
ステージングアプリおよびその他の非本番アプリでは、無料の 自己証明 SSL 証明書 を使用でき、SSL 証明書を購入する必要はありません。
SSL 証明書の購入は、ベンダーによって費用やプロセスが異なります。DNSimple と ExpeditedSSL は、証明書購入の簡略な方法を提供し、推奨のソリューションになります。
そうではなく、他の SSL プロバイダーを使用するには、次のステップの一部または全部を行う必要があります。
プライベートキーの生成
SSL 証明書を要求する前に、openssl
ツールを使用してローカル環境でプライベートキーを生成する必要があります。ターミナルから openssl
コマンドを実行できない場合、インストールする必要がある可能性があります。
所有している OS | インストールに使用するコード |
---|---|
Mac OS X | Homebrew: brew install openssl |
Windows | Windows 用完全パッケージ .exe インストーラー |
Ubuntu Linux | apt-get install openssl |
openssl
を使用して新しいプライベートキーを生成します。
求められた場合、簡単なパスワード値を入力します。これは CSR の生成時にのみ使用され、ランタイム時にアプリで使用されません。
Heroku は証明書に RSA キーのみをサポートします。楕円曲線 (ECC) キーはサポートしていません。
$ openssl genrsa -aes256 -out server.pass.key 4096
...
Enter pass phrase for server.pass.key:
Verifying - Enter pass phrase for server.pass.key:
プライベートキーからパスワードを取り除く必要があるので、パスワードを手動で入力せずにプライベートキーを読み込むことができます。
$ openssl rsa -in server.pass.key -out server.key
これで、現在の作業用ディレクトリに server.key
プライベートキーファイルが用意されます。
CSR の生成
CSR は、証明書署名要求のことであり、SSL 証明書の購入時にも必要になります。前のステップのプライベートキーを使用して CSR を生成します。これには、組織およびドメインに関する識別情報を入力する必要があります。
ほとんどのフィールドは一目瞭然ですが、次の点には特に注意してください。
フィールド | 説明 |
---|---|
国名 | 組織の本拠がある国の ISO 3166-1 形式の 2 文字コード。 |
共通名 | これは、保護する必要のある完全修飾ドメイン名です。
|
Common Name
フィールドは、安全なドメインに一致する必要があります。ルートドメイン (たとえば、example.com
) の証明書は購入できず、www.example.com
を保護することは期待できません。その逆もあります。
さらに、SSL エンドポイントは、アプリあたり 1 つの証明書しかサポートしません。マルチドメインアプリケーションにはこのことに留意し、必要なドメインすべてに一致する Common Domain
を指定してください。
CSR を生成します。
$ openssl req -nodes -new -key server.key -out server.csr
...
Country Name (2 letter code) [AU]:US
Common Name (eg, YOUR name) []:www.example.com
...
この操作の結果は、(前のステップからの server.key
プライベートキーファイルと並んで) ローカルディレクトリ内に server.csr
ファイルが生成されます。
SSL プロバイダーへの CSR の送信
次に、新しい SSL 証明書を作成するプロセスを、選択した証明書プロバイダーで開始します。これは、プロバイダーに応じて異なりますが、前のステップで生成された CSR をある時点でアップロードする必要があります。
どの Web サーバーで証明書を作成するかについても尋ねられることがあります。その場合は、Heroku で使用する Web サーバーとして Nginx を選択します。Nginx がオプションでない場合、Apache 2.x も対応します。
PKCS や X.509 など、使用する証明書形式のオプションが与えられている場合は、X.509 を選択します。
複数のサブドメインを保護する場合は、プロバイダーからワイルドカード証明書を購入する必要があります。これらの証明書は通常さらにコストがかかりますが、*.example.com
のすべてのサブドメインのリクエストに SSL で対応できるようになります。
SSL 証明書の購入プロセスが完了すると、次のような複数のファイルが用意されています。
- 証明書プロバイダーからダウンロードされた、CSR に指定されているドメインの SSL 証明書。このファイルには
.pem
または.crt
の拡張子が付けられます。 - 最初のステップで生成したプライベートキー (
server.key
)。
Heroku での SSL の設定
SSL 証明書ファイルおよびプライベートキーを入手したら、アプリの SSL エンドポイントをすぐに設定できます。Heroku での SSL 設定は、アプリケーションをデプロイする場所にわずかに依存します。
アドオンの作成
このステップは、Common Runtime 内のアプリについてのみ必要です。Private Space 内のアプリの場合、このステップをスキップします。
SSL エンドポイントは非推奨であるため、お客様によって追加できなくなりました。SSL エンドポイント機能が必要だと思われる場合は、Heroku Supportを参照してください。
次のコマンドでアドオンを作成します。
$ heroku addons:create ssl:endpoint
Adding ssl:endpoint on example... done, v1 ($20/mo)
証明書および中間証明書の追加
certs:add
コマンドで、証明書、すべての中間証明書、およびプライベートキーをエンドポイントに追加します。以下に示すように、このコマンドに --type endpoint
引数を含めることが必要になります。
Heroku は certs:add
コマンドの一部として、証明書チェーンの不要な部分を自動的に取り除きます。一部のシナリオでは、このことが望ましくない場合もあります。
$ heroku certs:add server.crt server.key --type endpoint
Adding SSL Endpoint to example... done
example now served by example-12345.ssl.herokudns.com.
Certificate details:
Expires At: 2012-10-31 21:53:18 GMT
Issuer: C=US; ST=CA; L=SF; O=Heroku; CN=www.example.com
Starts At: 2011-11-01 21:53:18 GMT
...
アプリに割り当てられたエンドポイント URL は出力に一覧表示され、この例では example-12345.ssl.herokudns.com
になります。この URL にアクセスすると、"no such app" というメッセージが表示されますが、これは予想された結果です。適切な検証ステップについて、詳細をお読みください。
Private Spaces 内のアプリの名前は、some-name.some-other-name.herokuspace.com
という形式になります。あらゆる状況で、certs:add
コマンドの出力は、このことを正確に反映します。
エンドポイントの詳細
SSL 設定の詳細は heroku certs
で確認できます。
$ heroku certs
Name Endpoint Common Name(s) Expires Trusted Type
─────────── ───────────────────────── ────────────────── ──────────────────── ─────── ────────
example-2121 example-12345.ssl.herokudns.com www.example.com 2018-06-30 23:59 UTC False Endpoint
証明書に関する詳細な情報を取得するには、certs:info
を使用します。
$ heroku certs:info
Fetching SSL Endpoint example-12345.ssl.herokudns.com info for example... done
Certificate details:
Expires At: 2012-10-31 21:53:18 GMT
Issuer: C=US; ST=CA; L=SF; O=Heroku; CN=www.example.com
Starts At: 2011-11-01 21:53:18 GMT
Subject: C=US; ST=CA; L=SF; O=Heroku; CN=www.example.com
...
非常に稀なケースで、SSL エンドポイントがプロビジョニングされるまでに長い時間がかかることがあります (30 分から 2 時間)。エンドポイント URL に到達できない場合、先に進む前に、この時間だけ待機してください。
DNS およびドメインの設定
SSL エンドポイントをプロビジョニングして証明書が確認されたら、エンドポイント URL を使用して安全なドメインのリクエストをルーティングする必要があります。まだ行っていない場合、次のコマンドを使用して、CSR を生成するときに指定されたドメインをアプリに追加します。
$ heroku domains:add www.example.com
Added www.example.com to example... done
SSL エンドポイントアドオンを使用しているとき、DNS ターゲットは heroku certs
を実行したときに Endpoint
の下に表示されることに注意してください。
heroku domains
の下に表示される DNS ターゲットは、Heroku SSL または Automated Certificate Management (ACM) で使用されるためのものです。
サブドメイン
サブドメイン (www.example.com
など) を保護する場合、DNS 設定を変更してエンドポイントの CNAME レコードを作成するか、CNAME レコードがすでにある場合は CNAME ターゲットを変更します。
レコード | 名前 | ターゲット |
---|---|---|
CNAME |
www |
example-12345.ssl.herokudns.com. |
ワイルドカード証明書を使用している場合、DNS 設定は同様になります。
レコード | 名前 | ターゲット |
---|---|---|
CNAME |
* |
example-12345.ssl.herokudns.com. |
ルートドメイン
ルートドメイン (example.com
など)を保護している場合、CNAME のような機能をゾーン Apex で提供している DNS プロバイダーを使用している必要があります。
DNS 設定を変更し、ALIAS または ANAME レコードをエンドポイントに対して作成します。
レコード | 名前 | ターゲット |
---|---|---|
ALIAS または ANAME |
<empty> または @ |
example-12345.ssl.herokudns.com. |
SSL のテスト
curl
などのコマンドラインユーティリティを使用して、すべてが安全なドメインに合わせて正しく設定されているかをテストします。
-k
オプションは、信頼できない証明書を無視するように crul に指示します。
$ curl -kvI https://www.example.com
* About to connect() to www.example.com port 443 (#0)
* Trying 50.16.234.21... connected
* Connected to www.example.com (50.16.234.21) port 443 (#0)
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using AES256-SHA
* Server certificate:
* subject: C=US; ST=CA; L=SF; O=SFDC; OU=Heroku; CN=www.example.com
* start date: 2011-11-01 17:18:11 GMT
* expire date: 2012-10-31 17:18:11 GMT
* common name: www.example.com (matched)
* issuer: C=US; ST=CA; L=SF; O=SFDC; OU=Heroku; CN=www.heroku.com
* SSL certificate verify ok.
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8r zlib/1.2.3
> Host: www.example.com
> Accept: */*
...
出力に注意してください。SSL certificate verify ok
が出力されます。common name: www.example.com (does not match 'www.somedomain.com')
などが出力された場合は、正しく設定されていないものがあります。
証明書の更新
Heroku は certs:update
コマンドの一部として、証明書チェーンの不要な部分を自動的に取り除きます。一部のシナリオでは、このことが望ましくない場合もあります。このチェーンの自動操作を回避するには、--bypass
フラグを含めます。
certs:update
コマンドを使用して新しい証明書と新しいまたは既存のプライベートキーに証明書を更新できます。
$ heroku certs:update server.crt server.key --endpoint example-12345.ssl.herokudns.com
Updating SSL Endpoint endpoint example-12345.ssl.herokudns.com for example... done
証明書の削除
certs:remove
コマンドを使用して証明書を削除できます。
$ heroku certs:remove --endpoint example-12345.ssl.herokudns.com
Removing SSL Endpoint endpoint example-12345.ssl.herokudns.com on example... done
証明書を削除すると SSL エンドポイントが削除されるため、その SSL エンドポイントを指定しているすべてのドメイン名は動作を停止します。
証明書を削除した後はロールバックできません。証明書を削除すると、SSL エンドポイントも削除されてロールバックは動作しません。
証明書を削除しても請求は停止されません。請求を停止するには、SSL エンドポイントアドオンを削除する必要があります。heroku addons:destroy ssl:endpoint
でアドオンを削除します。
証明書を削除する前に SSL エンドポイントアドオンを削除しようとすると、エラーを受け取ります。
クライアント IP アドレス
エンドクライアント (多くの場合はブラウザ) が SSL リクエストを開始すると、リクエストは、アプリに送信される前に暗号化する必要があります。この余分な SSL ターミネーションステップにより、リクエストの元の IP アドレスが不明瞭になります。回避策として、外部クライアントの IP アドレスが X-Forwarded-For
HTTP リクエストヘッダーに追加されます。
パフォーマンス
SSL エンドポイントインフラストラクチャは弾力性があり、過去のトラフィックレベルに基づいて自動的にサイズ変更します。ただし、新しく作成された SSL エンドポイントに大量のトラフィックを切り替えたり、トラフィックの急増が予想されたりする場合、Heroku サポートにご連絡ください。予防的なサイズ設定をお手伝いします。
サポートに連絡してエンドポイントを事前にウォームアップすることを検討する場合のしきい値は、初期のリクエスト率が 1 秒あたり 150 個を超えるか、既存の 1 秒あたりのリクエスト数が 5 分以内に倍増することです。これらの種類のリクエストを行う場合は、少なくとも 2 営業日前に Heroku に通知してください。
トラブルシューティング
信頼できない証明書
場合によっては、heroku certs
を実行したとき、証明書が信頼されないものとして表示されることがあります。
$ heroku certs
Endpoint Common Name Expires Trusted
------------------------ ---------------- ----------------------- -------
example-12345.ssl.herokudns.com www.example.com 2012-10-31 21:53:18 GMT False
このことが発生した場合、この証明書が Mozilla のルート CA のリストによって信頼されていないことが原因である可能性もあります。このような場合、証明書は多くのブラウザでは想定どおり機能します。
ルート認証局によって署名された証明書をアップロードしたが、信頼されていないというメッセージを受け取った場合、証明書に何らかの問題があります。たとえば、中間証明書が欠落している場合もあります。そのような場合、SSL プロバイダーから中間証明書をダウンロードして、certs:add
コマンドを再実行してください。
内部サーバーエラー
証明書を追加するときに Internal server error
が表示された場合は、古いバージョンの Heroku CLI がある可能性があります。
$ heroku certs:add server.crt server.key --type endpoint
Adding SSL endpoint to example... failed
! Internal server error.
! Run 'heroku status' to check for known platform issues.
CLI がインストールされていることを検証し、heroku update
で最新バージョンに更新してください。
SSL ファイルのタイプ
多くの異なるファイルタイプが、SSL 証明書の作成時に生成され、消費されます。
.csr
ファイルは証明書署名リクエストであり、これによって証明書プロバイダーとの証明書リクエストが開始され、組織に関する管理情報が含まれます。.key
ファイルは、サイトの SSL 対応リクエストに使用されるプライベートキーです。.pem
および.crt
の拡張子は、多くの場合区別なく使用され、どちらも base64 ASCII エンコードファイルです。技術的な違いは、.pem
ファイルには証明書とキーの両方が含まれ、.crt
ファイルには証明書だけが含まれているという点です。実際は、この相違は多くの場合無視されます。