[Node-RED] Let’s Encrypt + certbotでSSL化

別の記事にて自己署名証明書によるHTTPS化を行いました。

しかし、自己署名証明書では、ウェブページアクセス時に、警告が表示されます。(LINEブラウザの場合そもそも開けないです。)

そこで今回はしっかりとSSL認証を行い、警告の出ないウェブページにしていきます。

前提

Let’s Encrypt の証明書は「ドメインの所有者」だけに発行されます。
つまり DNS で名前解決できるドメイン名が必須 です。
なので ドメインを持っていない場合は、そのままでは使えません

持っていない場合… 自分のドメインを取得する!

  • お名前.com、さくらインターネット、Google Domains などで独自ドメインを取得(年間1,000円程度)。
  • これで Let’s Encrypt が利用可能になります。
    今後サービスとして外部公開するなら必須です。

DNS側の設定

VPS や自宅サーバの IP アドレスに A レコードを割り当てる。

例えば、hoge.co.jpというドメインを持っている場合以下のように登録する。

レコードタイプ:A   api.hoge.co.jp  <VPS や自宅サーバの IP アドレス> 

hoge.co.jpの前のapi.は何でもいいです。

いま api.hoge.co.jp をブラウザや ping すると、サーバに到達するはずです。

この「外部から名前解決できる」状態が Let’s Encrypt の必須条件です。

サーバ側の設定

1. certbot をインストール

sudo apt update
sudo apt install certbot

(もし snap が使える環境なら sudo snap install --classic certbot でもOK)

2. 証明書の取得

次に証明書を取得:

sudo certbot certonly --standalone -d api.hoge.co.jp
  • メールアドレス入力
  • 利用規約同意

が求められ、成功すると証明書がここに保存されます:

/etc/letsencrypt/live/api.hoge.co.jp/
  ├── fullchain.pem   ← 証明書(中間証明書込み)
  └── privkey.pem     ← 秘密鍵

3. Node-RED の設定

Node-RED の設定ファイルを編集します:

nano ~/.node-red/settings.js

次を追記(またはコメントアウト解除):

https: {
    key: require("fs").readFileSync("/etc/letsencrypt/live/api.hoge.co.jp/privkey.pem"),
    cert: require("fs").readFileSync("/etc/letsencrypt/live/api.hoge.co.jp/fullchain.pem")
},

4. Node-RED を再起動

sudo systemctl restart nodered.service

ブラウザから:

https://api.hoge.co.jp:1880

へアクセス。
→ 正常にセキュア接続が表示されるはずです。

お疲れ様でした。

もし正常にアクセスできない場合は、下のトラブルシューティングその2を参照ください。

おまけ. 自動更新

証明書は 90 日間有効。
自動更新を cron に登録しておきます

sudo crontab -e

追加:

0 3 * * * certbot renew --quiet && systemctl restart nodered

補足1:Aレコードで、サブドメインを指定というのはどういったことを実現しているのですか?

DNS の基本イメージ

  • ドメイン = インターネット上の名前
    例: e-tecs.co.jp
  • サブドメイン = ドメインを細かく分けて用途ごとに使えるようにしたもの
    例:
    • www.hoge.co.jp → ホームページ
    • mail.hoge.co.jp → メールサーバ
    • api.hoge.co.jp → API/Node-RED サーバ
  • Aレコード = 「この名前は、このIPアドレスのサーバだよ」と教える仕組み

今回の設定の意味

あなたが設定したのは:

api.hoge.co.jp → <サーバのIPアドレス>

つまり「api.hoge.co.jp にアクセスしたら VPS サーバに接続しなさい」というルールを世界中の DNS サーバに伝えた、ということです。

これで実現できること

  1. 複数の用途を分離できる
    • www.hoge.co.jp = 会社ホームページ(WordPress など)
    • api.hoge.co.jp = Node-RED
    • mqtt.hoge.co.jp = MQTT サーバ
    • など、用途ごとに分けられる
    → ユーザーや社員は「どこにアクセスすれば何があるか」を直感的にわかる
  1. SSL証明書を個別に取得できる
    • Let’s Encrypt は「ドメイン名ごと」に証明書を発行します。
    • 今回は api.hoge.co.jp 用の証明書を発行 → Node-RED ダッシュボードを HTTPS 化できる。
  1. セキュリティ・運用上の柔軟性
    • もしサーバを分ける場合でも、DNS の A レコードを書き換えるだけでよい。
      例: 将来 Node-RED を別の VPS に移したら、api.hoge.co.jp → 新IP にすればOK。
    • ユーザーやシステム側のアクセス先 URL は変わらない。

まとめ

  • サブドメイン = ドメインを機能ごとに切り分けた「住所」
  • Aレコード = 「その住所はどのサーバ(IPアドレス)にあるか」を紐づけるもの
  • 今回の設定で https://api.hoge.co.jp/ が、あなたの VPS 上の Node-RED に繋がるようになった

補足2:なぜドメインがないとSSL証明書は取得できないのでしょうか

SSL証明書の役割

SSL 証明書(正確には TLS 証明書)は大きく 2つの機能を持っています。

  1. 暗号化通信を可能にする
    • 鍵交換をして「ブラウザとサーバの間」を盗聴されないようにする。
  2. そのサーバが本当にそのドメインの正当な持ち主であることを証明する
    • 例えば https://api.hoge.co.jp とアクセスしたときに、
      「このサーバは確かに hoge.co.jp の正規のサーバです」と第三者(認証局)が保証する。

認証局 (CA) の立場

Let’s Encrypt のような認証局 (Certificate Authority, CA) は、証明書を発行するときに必ず「本人確認」をします。

  • この「本人確認」の対象が ドメイン名 です。
  • 証明書を発行するなら、「そのドメインを実際にコントロールしている人か?」を確認します。

確認方法は先ほどの「HTTP-01 チャレンジ」「DNS-01 チャレンジ」などですね。

ドメインがない場合

  • IP アドレスだけ(例: https://123.456.7.89/)では、認証局が「誰のものか」確認できません。
  • インターネットの仕組み上、IPアドレスは契約や環境によって変動することもあり、「所有者が誰か」を証明する手段がないのです。
  • したがって、正規の認証局は「IPアドレスだけ」に対して証明書を発行しません

(例外的に「証明書を売ってくれる商用CA」にお金を払えば IP アドレス証明書を発行できる場合はありますが、非常に特殊です)

ドメインがある場合

  • ドメイン名は DNS で世界的に一意に管理されています。
  • そのドメインを管理できる(DNSを編集できる)ことを確認すれば、「この人が正当な持ち主」と認証局は判断できる。
  • だからこそ Let’s Encrypt のような無料サービスでも、信頼性のある証明書を発行できるのです。

まとめ

  • SSL証明書は「サーバがこのドメインの正当な所有者であること」を証明するもの。
  • ドメインがなければ「何を証明するのか?」の対象が存在せず、認証局は証明できない。
  • だからドメインなしでは正規の SSL 証明書は発行されない。

逆に「LAN 内だけで自己署名証明書を使う」場合は、認証局を介さずに自分で証明書を作れるので ドメインがなくても可能 です。ただし、その場合は「第三者が保証してくれる信頼性」はありません。

トラブルシューティングその1

sudo certbot certonly –standalone -d api.hoge.co.jp を実行した際に以下の質問を聞かれることがあります。

すでに api.hoge.co.jp 用の証明書 が存在していて、まだ有効期限が残っている。

だから「新しく発行する必要がないけど、どうする?」と確認している。

選択肢の意味

  1. Keep the existing certificate for now
    → 今の証明書をそのまま使う(通常はこちらでOK)。
    • 有効期限が切れるまでは更新不要。
    • Let’s Encrypt は 90 日有効なので、期限が近づいたら自動更新で対応できます。
  2. Renew & replace the certificate
    → 強制的に更新して置き換える。
    • ただし「レート制限(発行回数の制限)」があるので、むやみに選ばない方が良いです。
    • テスト中やどうしても新しい証明書にしたい場合のみ。

推奨の対応

  • 初回セットアップで既に証明書が取得済みなら、「1」を選ぶのが正解 です。
  • そのまま settings.js/etc/letsencrypt/live/api.hoge.co.jp/{fullchain.pem, privkey.pem} を設定して Node-RED で利用すればOK。

トラブルシューティングその2

正常に表示されない場合は以下のコマンドを実行してエラーを確認してください。

node-red

すると以下のようなエラーが出ているかもしれません。

Error: EACCES: permission denied, open '/etc/letsencrypt/live/api.hoge.co.jp/privkey.pem'

これは Node-RED 実行ユーザーが /etc/letsencrypt/live/... の秘密鍵にアクセスできない というエラーです。

原因

  • Let’s Encrypt の秘密鍵 (privkey.pem) は非常に重要なので、root 権限のみ読み取れるようになっています。
  • node-red を普通のユーザー(ubuntu)で起動したので、読めなくてエラーになりました。

解決方法

証明書ファイルのコピーを作って Node-RED に渡す(推奨)

Let’s Encrypt が更新した証明書を、Node-RED が読める場所にコピーします。

コピー用ディレクトリ作成

sudo mkdir -p /etc/letsencrypt/nodered
sudo chown ubuntu:ubuntu /etc/letsencrypt/nodered

証明書をコピー

sudo cp /etc/letsencrypt/live/api.hoge.co.jp/fullchain.pem /etc/letsencrypt/nodered/
sudo cp /etc/letsencrypt/live/api.hoge.co.jp/privkey.pem /etc/letsencrypt/nodered/

権限を Node-RED 実行ユーザーに変更

sudo chown ubuntu:ubuntu /etc/letsencrypt/nodered/*.pem

settings.js を修正

https: {
    key: require("fs").readFileSync("/etc/letsencrypt/nodered/privkey.pem"),
    cert: require("fs").readFileSync("/etc/letsencrypt/nodered/fullchain.pem")
},

Node-redを再起動

systemctl restart nodered.service

これで ubuntu ユーザーで node-red を起動しても読めます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする