はじめに
本報告書の目的
本報告書は、Node.jsで安全な通信(SSL/TLS)を実現する方法をわかりやすくまとめたガイドです。実践で使える手順を中心に、自己署名証明書の作成、Let’s Encryptを使った証明書発行、httpsモジュールによるサーバー構築などを扱います。
想定読者
Node.jsの基礎(インストールや簡単なサーバー構築)が分かる方を想定しています。初めてSSLに触れる方にも配慮して、具体的なコマンドや設定例を示します。
本書で得られること
- 自己署名証明書を作成してテスト環境で使う方法
- 本番向けにLet’s Encryptを導入する流れ
- Node.jsのhttpsモジュールで安全なサーバーを立てる手順
前提と準備
説明はLinux系(例: Ubuntu)を想定します。WindowsやmacOSでも手順は似ていますが、コマンドが多少異なります。事前にNode.jsとnpm、管理者権限の取得を確認してください。
注意点(セキュリティ)
自己署名証明書は開発・検証用であり、本番公開には向きません。本番では必ず信頼された認証局の証明書を使ってください。
Node.jsで自己署名証明書を設定する方法
概要
ローカルや社内環境でHTTPSを使うために、自己署名証明書を作成してNode.jsが信頼するように設定する手順を分かりやすく説明します。OpenSSLで証明書を作成し、環境変数NODE_EXTRA_CA_CERTSでNode.jsに読み込ませる方法を紹介します。
1) 証明書と秘密鍵の作成(OpenSSL)
例として1つのコマンドで自己署名証明書を作成します。端末で次を実行してください。
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt -subj "/CN=localhost"
この結果、server.key(秘密鍵)とserver.crt(証明書)ができます。CNは接続先のホスト名に合わせてください。
2) Node.jsで認識させる方法
最も簡単な方法は環境変数NODE_EXTRA_CA_CERTSに作成した証明書(PEM形式)を指定することです。Nodeを起動する前に次のように設定します。
– Ubuntu / macOS(bash):
export NODE_EXTRA_CA_CERTS=/path/to/server.crt
node app.js
- systemdでサービス化する場合は、ServiceファイルのEnvironmentに同様のパスを設定してサービスを再起動します。
- Windows(PowerShell):
$env:NODE_EXTRA_CA_CERTS = 'C:\path\to\server.crt'
node app.js
コマンドプロンプトではsetやsetxを使いますが、PowerShellが便利です。
3) 注意点と確認方法
- Node.jsは起動時にこの変数を読み込みます。環境変数を変更した場合は必ず再起動してください。
- 証明書ファイルの読み取り権限を適切に設定してください(秘密鍵は厳重に管理)。
- 接続確認はcurlやブラウザ、あるいはNodeのhttpsモジュールで行えます。例:
curl -v --cacert server.crt https://localhost:443
以上で、自己署名証明書を作成しNode.jsで利用する基本手順の説明は終わりです。必要であれば、後続章でHTTPSサーバーの実装例を詳しくご案内します。
Node-REDでLet’s Encrypt + certbotを使用したSSL化
前提条件
- ドメイン名を所有し、A/AAAAレコードがサーバーIPを指すこと。
- サーバー上でNode-REDが動作していること。
DNS設定
まずDNSでドメイン(例: nodered.example.com)をサーバーIPに向けます。反映に数分〜数時間かかることがあります。確認はpingやdigで行います。
certbotのインストール
Debian/Ubuntuならsnapでのインストールを推奨します。例:
– sudo apt update && sudo apt install snapd
– sudo snap install core; sudo snap refresh core
– sudo snap install –classic certbot
– sudo ln -s /snap/bin/certbot /usr/bin/certbot
証明書の取得(例)
Node-REDのポート80を一時停止するか、webroot方式を使います。スタンドアロンで取得する例:
– sudo systemctl stop nodered
– sudo certbot certonly –standalone -d nodered.example.com
取得後、証明書は /etc/letsencrypt/live/nodered.example.com/ に配置されます(fullchain.pem と privkey.pem)。
Node-REDへの組み込み
Node-REDのsettings.jsを編集します。httpsセクションに証明書パスを指定します(例):
– https: { key: fs.readFileSync(‘/etc/letsencrypt/live/nodered.example.com/privkey.pem’), cert: fs.readFileSync(‘/etc/letsencrypt/live/nodered.example.com/fullchain.pem’) }
編集後、Node-REDを起動または再起動します(systemctl start|restart nodered)。
ファイル権限と所有者設定
証明書の安全性を保つため、鍵ファイルの権限を制限します。例:
– sudo chown root:root /etc/letsencrypt/live/nodered.example.com/privkey.pem
– sudo chmod 600 /etc/letsencrypt/live/nodered.example.com/privkey.pem
Node-REDを非rootユーザーで動かす場合は、鍵へアクセスできる専用グループを作成する方法もあります。
自動更新の設定
certbotは自動更新コマンドを提供します。cronやsystemdタイマーで certbot renew を実行し、更新後にNode-REDを再起動するフックを設定します。例:
– sudo certbot renew –deploy-hook “systemctl restart nodered”
この設定で更新後に自動でHTTPSが切れ替わります。
Node.jsでのHTTPSサーバー構築完全ガイド
前提
この章では、OpenSSLで自己署名証明書を作成し、PEM/PFX形式でNode.jsのHTTPSサーバーを起動する手順を丁寧に説明します。Expressでの実装例も含みます。
OpenSSLで自己署名証明書を作成
簡単なコマンド例:
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/CN=example.com"
-nodesは鍵にパスフレーズを付けないオプションです。パスフレーズ付きにしたい場合は省略します。
PEM形式でのHTTPS起動(ネイティブ)
const https = require('https');
const fs = require('fs');
const options = { key: fs.readFileSync('key.pem'), cert: fs.readFileSync('cert.pem') };
https.createServer(options, (req,res)=>{ res.writeHead(200); res.end('OK'); }).listen(443);
PFX形式での準備と起動
PFX作成:
openssl pkcs12 -export -out cert.pfx -inkey key.pem -in cert.pem -passout pass:yourpass
Node側:
const options = { pfx: fs.readFileSync('cert.pfx'), passphrase: 'yourpass' };
秘密鍵のパスフレーズ指定
パスフレーズを環境変数で渡す例:
const options = { key: fs.readFileSync('key.pem'), cert: fs.readFileSync('cert.pem'), passphrase: process.env.SSL_PASSPHRASE };
コマンド実行時に安全に渡すことを推奨します。
ExpressでのHTTPS実装
const express = require('express');
const app = express();
app.get('/', (req,res) => res.send('Hello HTTPS'));
https.createServer(options, app).listen(443);
注意点
- 本番では認証局発行の証明書を使ってください。
- 秘密鍵は適切な権限で保護し、公開しないでください。
- Linuxでポート443を使う場合はroot権限やプロキシ設定が必要です。
以上で基本的な設定と実装例の説明を終わります。












