DNS CNAMEレコードを設定したNode-REDにLet’s Encryptで証明書を発行しHTTPS化するメモ

DNS CNAMEレコードを設定したNode-REDにLet’s Encryptで証明書を発行しHTTPS化するメモです。

背景

こちらの記事の発展です。

Azure Virtual Machinesで動かした Node-RED へお名前.comのDNS CNAMEレコードを設定するメモ

現状のままですと、HTTP通信のため、たとえば、Webhook先がHTTPS必須であるLINE Botの受けのようなもののサーバーとして使うことができず不便です。ですので、Let’s Encryptで証明書を発行しHTTPS化してみます。

参考になった記事

いろいろ調べていたのですが「Let’s Encryptで証明書を発行し」「Node-REDで具体的に設定する」という観点で、以下の記事がとても参考になりました。

Node-RED SSL using Letsencrypt & Certbot – Share Your Projects – Node-RED Forum

ざっくりいうと

  • sudo su でroot権限で作業するようにして
  • certbotをインストールして
  • Let’s Encryptで証明書を発行して
  • Node-REDの設定フォルダ(.node-red)に証明書をコピーして
  • Node-REDの設定ファイル(settings.js)の設定で証明書を関連付けて
  • Node-REDを再起動するとHTTPS化が完了
  • 必要であれば、Node-REDの設定ファイル(settings.js)の設定でrequireHttpsをtrueにして、httpでアクセスしても強制的にhttpsに飛ぶようにします。

という流れです。

なお、さらに発展してLet’s Encryptで証明書を定期的に更新するというところは外しています。

シリアルコンソール起動

image

シリアルコンソールから操作します。

sudo su でroot権限で作業~certbotをインストール

Azure Virtual Machinesで動かした Node-RED へお名前.comのDNS CNAMEレコードを設定したものなのでUbuntuベースです。Node-RED 1.0.4 で動作しているもので進めます。

sudo su

でroot権限で作業を開始します。実は、sudoで全コマンド叩けばsuしなくてもいいかなと思ったのですが結構ハマったので、素直に上記コマンドを実行したほうが安心でした。

mkdir ~/.node-red/certs

いずれ、証明書をコピーするフォルダを作っておきます。

certbotをインストール

sudo apt-get install certbot

certbotをインストールします。

certbot --version

ちゃんとインストールされているかを確認します。

certbot 0.27.0

2020/04/01 時点では上記のバージョンで表示されました。

Let’s Encryptで証明書を発行

ここからは、皆さん自分の設定したドメインで証明書を発行します。

仮に、ドメインを

nodered-subdomain.example.com

と、します。

certbot certonly --standalone -d nodered-subdomain.example.com -m <発行に使う自分のメールアドレス>

<発行に使う自分のメールアドレス> は置き換えて実行すると、Please read the Terms of Service at ~ のところは、Agreeなので A を指定しました。

Would you be willing to share your email address with the Electronic Frontier のところは、Electronic Frontierのメーリングリストに入れたくないので No の N を選択しました。

出来上がったら、

ls -la /etc/letsencrypt/live/nodered-subdomain.example.com

で、

image

ファイルができているかを確認しておきます。

証明書をNode-REDのフォルダにコピー

Node-REDの起動しているユーザーを確認して、証明書をコピーして実行できるようにします。

cp /etc/letsencrypt/live/nodered-subdomain.example.com/*.pem /home/<username>/.node-red/certs/

まず、証明書が作られたところから、コピーします。

<username>

のところはNode-REDの起動しているユーザーに置き換えましょう。

ls -la /home/<username>/.node-red/certs/

念のため、出来上がったかどうか確認します。

ファイルのオーナーを変更

chown <username>:<username> /home/<username>/.node-red/certs/*.pem

コピーしたらファイルのオーナーを変更します。

<username>

のところはNode-REDの起動しているユーザーに置き換えましょう。

ls -la /home/<username>/.node-red/certs/

再度確認してみると、ファイルのオーナーがになっているはずです。

Node-REDの設定ファイル(settings.js)の設定

https設定値

https の設定部分に、

    https: {
        key: fs.readFileSync('/home/<username>/.node-red/certs/privkey.pem'),
        cert: fs.readFileSync('/home/<username>/.node-red/certs/fullchain.pem')
    },

先ほどのコピー先の privkey.pem と fullchain.pem を割り当てます。

<username>

のところはNode-REDの起動しているユーザーに置き換えましょう。

fsを開放

これはfs.readFileSync を使っているので、ファイル読み込みのライブラリを読み込むようにしましょう。この設定はすでに settings.js の結構上の方に書かれています。探してみましょう。

// var fs = require("fs");

var fs = require("fs");

して、

image

のように使えるようにします。

再起動して確認

あとは、Node-REDを再起動してアクセスしてみましょう。

image

httpsでアクセスしてみて表示されたら成功です。

必要であれば、httpでアクセスしても強制的にhttpsに飛ぶ設定も

requireHttps: true,

必要であれば、Node-REDの設定ファイル(settings.js)の設定でrequireHttpsをtrueにして、httpでアクセスしても強制的にhttpsに飛ぶようにしましょう。

ただ、一度設定がうまくいったか確認するのがいいでしょう。

そうしないと、問題の切り分けがやりにくくなります。(実際ハマりました)