Node.js + Express の環境で HTTPS 通信できるようにする方法を整理しました。 あまり複雑な要素は含めずできるだけシンプルなサンプルコードを掲載します。
HTTPS サーバー 構築
Windows の IIS で自己署名入り証明書 をエクスポートすると PKCS#12 の証明書 (拡張子 pfx のファイル) になっているので、 今回は pfx を指定してHTTPSサーバーを構築してみます。
IIS で 自己署名入り証明書 を作成、エクスポートする方法は以下の「自己署名証明書の作成」を参照してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var express = require( "express" ); var fs = require( "fs" ); var https = require( "https" ); var app = express(); var options = { pfx: fs.readFileSync( "./private/localhost.pfx" ), passphrase: "Passw0rd" }; app.get( "/" , (request, response)=>{ response.writeHead(200); response.end( "Hello World." ); }); https.createServer(options, app).listen(443); |
httpsサーバー構築する場合、署名済み公開鍵と秘密鍵をオプションで設定してあげる必要があります。 上記のコードは 署名済み公開鍵と秘密鍵 の両方を含む pfx ファイル を指定しています。
http で良ければ app.listen()
とできるところですが…、
https の場合、 https.createServer()
に 証明書情報 と Express のインスタンス を渡すことで実現します。
ポート番号に 443
を指定しておくことも注意です。
上記コードを実行して https://localhost/
へ接続すると "Hello World." の応答が表示されることが確認できます。
HTTP と HTTPS を共存させた サーバー 構築
上記の HTTPSサーバー構築 に加えて http 用のサーバーを同時に生成、実行することで共存させることができます。 追加するコードはハイライトしている部分です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | var express = require( "express" ); var fs = require( "fs" ); var http = require( "http" ); var https = require( "https" ); var app = express(); var options = { pfx: fs.readFileSync( "./private/localhost.pfx" ), passphrase: "Passw0rd" }; app.get( "/" , (request, response)=>{ response.writeHead(200); response.end( "Hello World." ); }); http.createServer(app).listen(80); https.createServer(options, app).listen(443); |
[おまけ] 自己署名証明書の作成
OpenSSL を利用して自己署名証明書作成はよく見かけるので… ここでは IIS を使った Windows の開発環境で簡単に自己署名証明書を作成する方法を見てみます。
-
IIS の 管理コンソール を開く
-
「サーバー証明書」をダブルクリックして開く
-
操作ペインの「自己署名入り証明書の作成」を選択
-
フレンドり名を指定して「OK」を選択
-
作成した「自己署名入り証明書」が選択されているので、操作ペインの「エクスポート」を選択
-
出力先、パスワードを指定して「OK」を選択
参考記事
- Express - APIリファレンス
- MINKO GECHEV'S BLOG - Express over HTTPS
- StackOverflow - I'm using .pfx certification in my node.js https server and I can't use 'passphrase' in option
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!