Heroku SSL
最終更新日 2024年02月08日(木)
Table of Contents
SSL は、すべての Web リクエストにエンドツーエンド暗号と整合性をもたらす暗号化プロトコルです。機密性の高いデータを転送するアプリでは、すべての情報を安全に転送できるように SSL を有効にします。
Heroku SSL は、すべての Heroku アプリで SSL を有効にする機能の組み合わせです。Heroku SSL では、広くサポートされている TLS プロトコルの拡張機能である Server Name Indication (SNI) を使用します。
証明書のオプション
アプリは提供された*.herokuapp.com
証明書、Automated Certificate Management (ACM)、または手動アップロードされた証明書を使用します。
証明書の手動アップロード
certs:add
Heroku CLI コマンドを使用して、証明書と秘密鍵を追加します。証明書と鍵のペアを関連付ける相手であるカスタムドメインを指定するよう求められます。
$ heroku certs:add server.crt server.key
Adding SSL to example... done
exampleapp now served by exemplary-sushi-4gr7rb6h8djkvo9j5zf16mfp.herokudns.com.
Certificate details:
Expires At: 2022-08-18 21:53:18 GMT
Issuer: C=US; ST=CA; L=SF; O=Heroku; CN=www.example.com
Starts At: 2021-08-18 21:53:18 GMT
...
中間証明書が必要な場合は、完全なチェーンを取得するための証明書のマージに関するこの記事を参照してください。
証明書が正常に追加されたら、コマンド出力から DNS ターゲットを取得して、アプリケーションでその証明書が提供されていることを確認します。
$ openssl s_client -connect <dns target>:443 -servername <domain>
次に例を示します。
openssl s_client -connect exemplary-sushi-4gr7rb6h8djkvo9j5zf16mfp.herokudns.com:443 -servername www.example.com
確認が成功したら、アプリで各ドメインの DNS 設定を更新します。heroku domains を実行すればいつでも、アプリに関連付けられているカスタムドメインに割り当てられた DNS ターゲットの一覧を表示できます。証明書を追加した後、DNS ターゲットのパターンは <adjective>-<noun>-<random>.herokudns.com
になります。前の例のターゲットは exemplary-sushi-4gr7rb6h8djkvo9j5zf16mfp.herokudns.com
です。heroku domains
を実行すればいつでも、アプリに関連付けられているカスタムドメインに割り当てられた DNS ターゲットの一覧を表示できます。
他の場所で必要な場合、アップロードした秘密鍵のコピーは常に安全に保管してください。Heroku では、そのシステムから秘密鍵を抽出することは許可していません。
SSL 証明書の詳細の表示
1 つのアプリで、複数の一意な証明書を受け入れることができます。アプリの証明書の一覧を表示するには、certs
コマンドを使用します。
$ heroku certs
Name Common Name(s) Expires Trusted Type Domains
──────────────────── ─────────────────────── ──────────────────── ─────── ──── ───────
mamenchisaurus-65072 kapow.herokudev.frsm.us 2022-02-03 19:53 UTC False SNI 0
oviraptor-60827 bar.herokudev.frsm.us 2022-02-03 19:40 UTC False SNI 1
証明書に関する詳細な情報を取得するには、certs:info
を使用します。
$ heroku certs:info --name=mamenchisaurus-65072
Fetching SSL mamenchisaurus-65072 info for exampleapp... 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
...
証明書とドメインのマッピングを更新する
heroku certs:info --show-domains
コマンドは、証明書に関連付けられているドメインを表示します。
証明書をドメインに関連付ける、または、証明書とカスタムドメインのマッピングを更新するには、heroku domains:update
コマンドを使用します。
$ heroku domains:update www.example.com --cert mycert
Updating www.example.com to use mycert certificate... done
SSL が正しく設定されていることの確認
ドメインが正しく設定されていることをテストするには、curl などのコマンドラインユーティリティを使用します。
$ curl -vI 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 (doesn’t match 'www.somedomain.com')
などが出力された場合は、正しく設定されていないものがあります。
macOS をご使用の方へ: curl
コマンドで -k
フラグを使用すると、接続エラーが発生する可能性があります。macOS の多くのバージョンでは、curl
で -k
を指定しても SNI 情報は渡されません。
証明書の更新
certs:update
コマンドでは、新規の証明書と、新規または既存の秘密鍵を使用して更新を行います。
$ heroku certs:update --name=mamenchisaurus-65072 server.crt server.key
Updated certificate details:
Common Name(s): www.example.com
Expires At: 2017-03-21 21:35 UTC
Issuer: /C=US/ST=California/L=San Francisco/O=Heroku/OU=Engineering/CN=www.example.com
Starts At: 2016-03-21 21:35 UTC
Subject: /C=US/ST=California/L=San Francisco/O=Heroku/OU=Engineering/CN=www.example.com
証明書の削除
certs:remove
コマンドを使用して証明書を削除します。
$ heroku certs:remove --name=mamenchisaurus-65072
Removing SSL certificate mamenchisaurus-65072 (exemplary-sushi-4gr7rb6h8djkvo9j5zf16mfp.herokudns.com) from example... done
証明書を削除すると、証明書のドメインへの HTTPS トラフィックがすべて中止されます。
SSL の詳細
クライアント IP アドレス
クライアント (多くの場合ブラウザ) では、SSL リクエストを開始すると、アプリに送信する前にリクエストを復号化します。この余分な SSL ターミネーションステップにより、リクエストの元の IP アドレスが不明瞭になります。
回避策として、X-Forwarded-For
HTTP リクエストヘッダーには、外部クライアントの IP アドレスが含まれます。
サポートされる SSL プロトコル
- TLS 1.2
- TLS 1.3
セキュリティ上の理由により、SSLv3、TLS 1.0、または TLS 1.1 は Heroku でサポートされていません。Heroku では、セキュリティのベストプラクティスと後方互換性のバランスをとるために、暗号スイートを精選しています。
Heroku SSL では、Common Runtime アプリの TLS バージョンまたは暗号のカスタマイズは許可されていません。Private Space アプリの暗号スイートを調整する方法については、「Private Space でのルーティング」を参照してください。
内部ルーティングを使用するアプリでの Heroku SSL の使用
内部でルーティングされるアプリで Heroku SSL を使用する場合は、カスタムドメインで DNS-01 チャレンジを使用する必要があります。内部でルーティングされるアプリには、外部からアクセスまたは検証できないプライベート IP があるため、他のチャレンジタイプ (HTTP-01、TLS-ALPN-01) は機能しません。
トラブルシューティング
内部サーバーエラー
証明書を追加するときに Internal server error
が発生した場合は、Heroku CLI のバージョンが古くないかどうかを確認してください。CLI がインストールされていることを検証し、heroku update
で最新バージョンに更新するか、再インストールしてください。
SSL ファイルの種類
SSL 証明書の作成では、何種類かのファイルが生成および使用されます。
.csr
ファイルは証明書署名要求です。このファイルによって、証明書プロバイダーに対する証明書要求を開始します。このファイルには、要求元の組織に関する管理情報が含まれます。.key
ファイルは、サイトの SSL 対応リクエストに使用される秘密鍵です。.pem
および.crt
拡張子はどちらも base64 ASCII エンコードファイルです。多くの場合、互いに交換可能なものとして使用されますが、技術的な違いとしては、.pem
ファイルには証明書およびキーが含まれます。.crt
ファイルには証明書のみが含まれます。実際は、この相違は多くの場合無視されます。