初心者でも安心!sslとnodejsでHTTPS環境を簡単に構築する方法

目次

はじめに

本報告書の目的

本報告書は、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権限やプロキシ設定が必要です。

以上で基本的な設定と実装例の説明を終わります。

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

この記事を書いた人

目次