OpenSSL で構築した認証局 (CA) で発行したサーバ証明書を利用して HTTPS 通信する方法
HTTPS 通信を行う準備
ここでは次の二点の準備がしてあることを想定しています。
ひとつめの準備は、「OpenSSL で認証局 (CA) を構築する手順」の手順で認証局 (CA) が構築してあることです。
クライアントの環境に CA 証明書がインストールされていないとブラウザで警告(またはエラー)が発生しますので、必要に応じてCA証明書をインストールしてください。
もうひとつの準備は「OpenSSL で構築した認証局 (CA) でサーバ証明書を発行する方法」に従って、 サーバ証明書と秘密鍵が作成してあることです。
ここではウェブサーバーのホスト名は foo.example.com としていて、証明書のファイルとキーファイルはそれぞれ次のファイルです。
- intermediate\certs\foo.example.com.cert.pem
- intermediate\private\foo.example.com.key.pem
ちなみに、秘密鍵のパスフレーズは password としています。
もし、これらの準備ができていないのでしたら、上記の資料に従って準備してください。
Node + Express で HTTPS 通信を行う
それでは簡単なプログラムを作成して、HTTPS 通信の確認をしましょう。
コマンドプロンプトを開き現在のディレクトリの下に、test というディレクトリを作成して、その中にコードを作成します。
> mkdir test > cd test > npm init > npm install --save express
この test フォルダ内に証明書ファイルと秘密鍵ファイルの両方コピーしてください。
index.js を次の内容で作成します。
const express = require('express');
const http = require('http');
const https = require('https');
const fs = require('fs');
const options = {
cert: fs.readFileSync('foo.example.com.cert.pem'),
key: fs.readFileSync('foo.example.com.key.pem'),
passphrase: 'password',
};
const app = express();
app.get('/test1', (req, res) => {
res.status(200).json({
message: 'Hello'
});
});
http.createServer(app).listen(3001, () => {
console.log('HTTP listening on 3001...');
});
https.createServer(options, app).listen(3002, () => {
console.log('HTTPS listening on 3002...');
});
このプログラムを実行します。
> node index.js
さて、これにブラウザ (あるいは Postman など) から HTTPS 要求を行います。
同じシステム内であれば https://localhost:3002/test1 で接続できるはずです。
ホスト名が異なることでブラウザのセキュリティの警告が表示される場合は、hosts ファイルに次のエントリーを入力します。
127.0.0.1 foo.example.com
Windows では hosts は %SYSTEMROOT%\System32\drivers\etc にあります。メモ帳で編集するときには、 メモ帳を管理者として起動して、編集して保存します。
hosts を設定すれば https://foo.example.com:3002/test1 とすることで、警告やエラーなしにアクセスできるはずです。