Node.js + Express で HTTPS サーバーを構築し、SSL 証明書を設定する方法
Node.js + Express で SSL 証明書を設定する方法
このチュートリアルでは、Node.js と Express を使用して HTTPS サーバーを構築し、SSL 証明書を設定する方法を説明します。
準備するもの
- Node.js (インストール済み)
- Express (インストール済み)
- OpenSSL (インストール済み)
- ドメイン名 (必須ではないが、推奨)
手順
-
秘密鍵と証明書を作成する
OpenSSL を使用して、秘密鍵と自己署名証明書を作成します。以下のコマンドを実行します。
openssl genrsa -out server.key 2048 openssl req -new -key server.key -out server.csr openssl x509 -req -in server.csr -signkey server.key -out server.crt -days 365
上記のコマンドを実行すると、
server.key
(秘密鍵)、server.csr
(証明書署名要求)、server.crt
(証明書) ファイルが作成されます。 -
Express アプリケーションを作成する
新しい Express アプリケーションを作成します。以下のコマンドを実行します。
npm init -y npm install express
app.js
という名前のファイルを作成し、以下のコードを追加します。const express = require('express'); const app = express(); app.get('/', (req, res) => { res.send('Hello from HTTPS!'); }); app.listen(3000);
-
HTTPS サーバーを起動する
以下のコードを追加して、HTTPS サーバーを起動します。
const https = require('https'); const options = { key: fs.readFileSync('server.key'), cert: fs.readFileSync('server.crt'), }; const httpsServer = https.createServer(options, app); httpsServer.listen(443);
上記コードを実行すると、HTTPS サーバーがポート 443 で起動します。
-
ブラウザで確認する
Web ブラウザを開き、以下の URL にアクセスします。
https://localhost:443
注意: ドメイン名を使用している場合は、
localhost
をドメイン名に置き換えてください。「Hello from HTTPS!」というメッセージが表示されれば、SSL 証明書の設定が成功しています。
- 上記の手順は、自己署名証明書を使用しています。本番環境では、Let's Encrypt などの認証局から発行された証明書を使用する必要があります。
- HTTPS サーバーを起動する前に、ファイアウォール設定でポート 443 を開く必要があります。
const express = require('express');
const https = require('https');
const fs = require('fs');
const app = express();
app.get('/', (req, res) => {
res.send('Hello from HTTPS!');
});
const options = {
key: fs.readFileSync('server.key'),
cert: fs.readFileSync('server.crt'),
};
const httpsServer = https.createServer(options, app);
httpsServer.listen(443);
説明
express
とhttps
モジュールのインポート:express
モジュールは、Web アプリケーションフレームワークを提供します。https
モジュールは、HTTPS サーバーを作成するために使用されます。
app
変数の作成:- ルートパス (
/
) への GET リクエストの処理:app.get('/', (req, res) => {...})
は、ルートパス (/
) への GET リクエストを処理するハンドラー関数を定義します。- このハンドラー関数は、
res.send('Hello from HTTPS!')
を使用して、"Hello from HTTPS!" というメッセージをレスポンスとして送信します。
options
オブジェクトの作成:options
オブジェクトは、HTTPS サーバーの設定を指定するために使用されます。key
プロパティは、秘密鍵ファイルのパスを指定します。
- HTTPS サーバーの作成:
- HTTPS サーバーの起動:
Certbot は、Let's Encrypt から簡単に証明書を取得してインストールできるツールです。
手順:
-
Certbot をインストールします。
sudo apt install certbot # Debian/Ubuntuの場合 # 他のOSの場合は、インストール方法が異なる場合があります。
-
Certbot を使用して証明書を取得します。
certbot --nginx # 上記のコマンドは、Nginx サーバー用の証明書を取得します。 # 使用しているWebサーバーの種類に応じて、オプションを変更する必要があります。
-
以下のコードは、Certbot で取得した証明書を使用して HTTPS サーバーを起動する方法の例です。
const express = require('express'); const https = require('https'); const fs = require('fs'); const app = express(); app.get('/', (req, res) => { res.send('Hello from HTTPS!'); }); const httpsServer = https.createServer({ key: fs.readFileSync('/etc/letsencrypt/live/your-domain/privkey.pem'), cert: fs.readFileSync('/etc/letsencrypt/live/your-domain/fullchain.pem'), }, app); httpsServer.listen(443);
注意:
- 上記コードは、Nginx サーバー用の Certbot で取得した証明書を使用することを前提としています。
- 使用しているWebサーバーの種類に応じて、コードを適宜変更する必要があります。
/etc/letsencrypt/live/your-domain
は、Certbot で取得した証明書の場所を置き換える必要があります。
acme-client を使用する
acme-client は、Let's Encrypt などの認証局からプログラム的に証明書を取得できるライブラリです。
-
acme-client をインストールします。
npm install acme-client
-
const express = require('express'); const https = require('https'); const { ACME, Client } = require('acme-client'); const app = express(); app.get('/', (req, res) => { res.send('Hello from HTTPS!'); }); const acme = new ACME({ directory: 'https://acme-v2.letsencrypt.org/directory', accountKey: fs.readFileSync('account.key'), }); const client = new Client({ acme }); client.createAccount({ email: '[email protected]', termsOfServiceAccepted: true, }).then(() => { return client.createOrder({ domains: ['your-domain'], }); }).then((order) => { return client.challenges.poll(order, { dns: { domains: ['your-domain'], token: 'your-token', keyAuthorization: 'your-key-authorization', }, }); }).then(() => { return client.finalizeOrder(order); }).then((certificate) => { const privateKey = fs.readFileSync('private.key'); const httpsServer = https.createServer({ key: privateKey, cert: certificate, }, app); httpsServer.listen(443); }).catch((error) => { console.error(error); });
- 上記コードは、例としてのみ使用してください。
- 本番環境で使用する場合は、適切なエラー処理とセキュリティ対策を追加する必要があります。
Heroku などのプラットフォームを使用する
Heroku などのプラットフォームは、SSL 証明書を自動的に管理してくれるので、自分で設定する必要はありません。
- Heroku アカウントを作成します。
- Heroku アプリケーションを作成します。
- アプリケーションのドメイン名を設定します。
Heroku は、ドメイン名に基づいて自動的に SSL 証明書を取得してインストールします。
node.js express ssl-certificate