以前、Node.jsとSocket.IOでリアルタイムのチャットアプリを作ってみた。
チャットアプリを常時SSL化する必要が出てきたので、その時行った対応を記載する。
Node.jsとSocket.IOでリアルタイムのチャットアプリを作ってみる
常時SSL化をするにあたって、
Let's Encrypt - Free SSL/TLS Certificates
いつもの通り、Let's Encryptを利用します。
※Let's Encryptの設定は下記の記事に記載してある。
はじめに今回の開発環境を記載しておくと
サーバ:さくらVPS 512Gプラン
OS:Ubuntu 16.04
Node.js:9.2.1
npm:5.5.1
Socket.IO:2.0.3
先にhttpで運営する方のコードを記載しておくと、
const server = require("http").createServer(); server.listen(8080); // HTTPをWebSocketにUpgradeする const io = require("socket.io").listen(server); //以下省略
こんな感じ。
ここをhttpsにする場合は、require("http")の箇所をrequire("https")にしたいところだけれども、
SSL(TLS)を利用する場合はサーバ証明書等のファイルの読み込みが必要になる。
そこで、
config.json
{ "key" : "/etc/letsencrypt/live/sample.domain/privkey.pem", "cert" : "/etc/letsencrypt/live/sample.domain/cert.pem", "chain" : "/etc/letsencrypt/live/sample.domain/chain.pem", "fullchain" : "/etc/letsencrypt/live/sample.domain/fullchain.pem" }
※sample.domainにはご利用中のサーバのドメインを入れる
このような常時SSL化時に読み込まなければならないファイルのパスを記載したJSONのファイルを用意し、
let config = JSON.parse(fs.readFileSync("config.json")); let opts = { key: fs.readFileSync(config.key), cert: [fs.readFileSync(config.cert)], ca: [fs.readFileSync(config.chain), fs.readFileSync(config.fullchain)] }; const server = require("https").createServer(opts); server.listen(8080); // HTTPをWebSocketにUpgradeする const io = require("socket.io").listen(server); //以下省略
証明書のファイルを読み込めるように書き換えた。
今回はrootでなければ読み込めない証明書のファイルがあるため、
前回までの
node index.js
では実行できず、
sudo node index.js
のようにsudor権限で実行する、もしくは各種ファイルのシンボリックパスを作成して読み込む必要がある。
foreverで永続化する場合も同様にsudor権限での実行等の対処が必要。
関連記事