セルフ署名のサーバ証明書を利用して HTTPS 通信を実現する方法

HTTPS 通信を行うにはサーバ証明書の設定が必要です。

ソフトウェアを開発して、実際に一般ユーザー向けに運用する場合には、信頼できる認証局(サーバ証明書発行サービスを行っている業者)にサーバ証明書を発行してもらうのが普通です。無料で発行してくれるところもありますが、 通常は費用が発生します。

しかし、開発時には必ずしも外部の認証局に証明書を発行してもらう必要はありません。 OpenSSL などのツールで証明書を自分で作成して、それを利用することで HTTPS 通信を実現できます。

信頼された認証局で発行した証明書を使わないと、ブラウザの画面ではセキュリティ上の警告が表示されます。

次のコマンドでサーバー証明書を発行することができます。

> openssl genrsa -out key.pem
> openssl req -new -key key.pem -out csr.pem
> openssl x509 -req -days 9999 -in csr.pem -signkey key.pem -out cert.pem

最初のコマンドでは秘密鍵 key.pem を生成しています。 次のコマンドでは、最初のコマンドで作成した秘密鍵を使って、CSR csr.pem を作成しています。

最後のコマンドで csr.pem に生成した秘密鍵で署名することによって、 サーバ証明書 cert.pem を生成しています。

Node.js + Express で HTTPS を利用するサンプルコードは次のようになります。

次のコマンドで Node プロジェクトを作成して、express をインストールします。

> mkdir test
> cd test
> npm init
> npm install --save express

index.js を次のようにします。

const express = require('express');
const https = require('https');
const fs = require('fs');
const app = express();

const options = {
    key: fs.readFileSync('key.pem'),
    cert: fs.readFileSync('cert.pem')
};

app.get('/test1', (req, res) => {
    res.status(200).json({ message: 'Hello!'});
});

https.createServer(options, app).listen(3001, () => console.log('HTTPS listening on 3001...'));

この例では 3001 番ポートで HTTPS を待ち受けています。

ブラウザから https://localhost:3001/test1 を要求することで動作確認できます。 ただし、信頼されているCAで発行した(署名した)証明書を使用していないので、ブラウザでは通常セキュリティの警告が表示されます。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Node.js 入門