web-dev-qa-db-ja.com

Heroku Node ExpressアプリでLetsEncryptSSL証明書を使用するにはどうすればよいですか?

LetsEncryptの無料のSSL証明書で暗号化したいNode ExpressアプリをHerokuで実行しています。ただし、これまでに見た方法では、ポート443と80を開く必要があります。 ACMEプロセスを機能させるため。

Herokuは1つのポートしか提供せず、どのポートを選択することはできません。では、LetsEncryptをどのように使用できますか?

私は昨日これを理解するのにたくさんの時間を費やしました。久しぶりに、私がやろうとしていたことに対するStackOverflowの回答がありませんでした!

13
stone

更新:

HerokuはLetsEncryptをネイティブにサポートするようになりました!したがって、この回避策は不要になりました。

ここでの手順:

https://devcenter.heroku.com/articles/automated-certificate-management

新しいアプリの場合、何もする必要はありません。デフォルトでオンになっています。 2017年3月21日より前に作成されたアプリの場合、次のHerokucliコマンドでオンにできます:heroku certs:auto:enable

ありがとう@SpainTrain


バックグラウンド

理想的には、LetsEncryptは自動化された証明書更新プロセスを可能にします。これはHerokuで行うのが難しいため、この回答では手動プロセスの使用方法について説明します。 Heroku環境変数を使用すると、コードを変更することなく、かなり簡単に手動で証明書を更新できます。

この回答の功績は、主に2つの素敵なブログ投稿にあります: https://medium.com/@franxyzxyz/setting-up-free-https-with-heroku-ssl-and-lets-encrypt-80cf6eac108e#。 67pjxutaw
そして
https://medium.com/should-designers-code/how-to-set-up-ssl-with-lets-encrypt-on-heroku-for-free-266c185630db#。 ldr9wrg2j

Herokuでの自動証明書更新をサポートしていると思われるGitHubプロジェクトがあります。試してみたら、この回答を更新します。
https://github.com/dmathieu/sabayon

Node ExpressアプリでHerokuでLetsEncryptを使用する

Expressサーバーを準備します。

このミドルウェアをExpressアプリに追加します。このエンドポイントはhttpである必要があるため、httpをhttpsにリダイレクトするミドルウェアの前に必ず追加してください。

// Read the Certbot response from an environment variable; we'll set this later:

const letsEncryptReponse = process.env.CERTBOT_RESPONSE;

// Return the Let's Encrypt certbot response:
app.get('/.well-known/acme-challenge/:content', function(req, res) {
  res.send(letsEncryptReponse);
});

Certbotを使用して証明書ファイルを作成します。

  1. Certbotを開始します:Sudo certbot certonly --manual
    プロンプトが表示されたらサイトのURLを入力します(www.example.com)
    certbotは、チャレンジレスポンス文字列を次の形式で表示します
    xxxxxxxxxxxxxxxxxxx.yyyyyyyyyyyyyyyyyy
    CERTBOTをこの状態で待機させてください。まだEnterキーを押したり終了したりしないでください。
  2. Herokuダッシュボードに移動し、アプリの設定を表示します。
    https://dashboard.heroku.com/apps/your-heroku-app-name/settings
    [構成変数]で、[構成変数の表示]をクリックします
    CERTBOT_RESPONSE変数の値を編集して、手順aのチャレンジレスポンスに一致させます。
  3. Herokuアプリが再起動するのを待ちます。
  4. http://www.example.com/.well-known/acme-challenge/whatever にアクセスして設定をテストします
    HTTPSではなくHTTPに注意してください
    チャレンジレスポンス文字列が表示されます。これが発生した場合は、次の手順に進みます。そうでない場合は、続行する前に、そのURLを取得してCR文字列を返すために必要なことをすべて実行してください。そうしないと、このプロセス全体を繰り返す必要があります。
  5. Certbotに戻り、Enterキーを押して続行します。
    すべてが計画どおりに進んだ場合、certbotはすべてが機能したことを通知し、作成された証明書の場所を表示します。次のステップでこの場所を使用します。 OSの権限により、フォルダの内容を確認できない場合があることに注意してください。疑わしい場合は、Sudo ls /etc/letsencrypt/live/www.example.comでファイルが存在するかどうかを確認してください。

新しい証明書を使用するようにHerokuインスタンスを更新します。

サイトに証明書がない場合は、heroku certs:addを実行します。更新する場合は、heroku certs:updateを実行します。
Sudo heroku certs:update --app your-heroku-app-name /etc/letsencrypt/live/www.example.com/fullchain.pem /etc/letsencrypt/live/www.example.com/privkey.pem

18
stone

ドメインの所有権を検証して、HTTPの代わりにDNSで暗号化することもできます。

certbotを使用して、優先チャレンジとしてDNSを指定します。

Sudo certbot certonly --manual --preferred-challenges dns

いくつかのプロンプトの後、certbotは、ドメインを検証するためにDNS TXTレコードをデプライするように指示します:

Please deploy a DNS TXT record under the name
_acme-challenge.www.codesy.io with the following value:

CxYdvM...5WvXR0

Once this is deployed,
Press ENTER to continue

ドメインレジストラには、おそらくTXTレコードをデプロイするための独自のドキュメントがあります。それを実行し、certbotに戻ってEnterキーを押してください-Let'sEncryptはTXT記録し、証明書に署名すると、certbotによって保存されてherokuにアップロードできます。

詳細については私の詳細なブログ投稿 を参照してください。

2
groovecoder