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で証明書を定期的に更新するというところは外しています。
シリアルコンソール起動
シリアルコンソールから操作します。
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
で、
ファイルができているかを確認しておきます。
証明書を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");
して、
のように使えるようにします。
再起動して確認
あとは、Node-REDを再起動してアクセスしてみましょう。
httpsでアクセスしてみて表示されたら成功です。
必要であれば、httpでアクセスしても強制的にhttpsに飛ぶ設定も
requireHttps: true,
必要であれば、Node-REDの設定ファイル(settings.js)の設定でrequireHttpsをtrueにして、httpでアクセスしても強制的にhttpsに飛ぶようにしましょう。
ただ、一度設定がうまくいったか確認するのがいいでしょう。
そうしないと、問題の切り分けがやりにくくなります。(実際ハマりました)