LoginSignup
6
3

More than 3 years have passed since last update.

EC2上にNode.jsでWSSサーバをたてる

Last updated at Posted at 2019-09-18

はじめに

WebSocketの通信テスト(SSL)を簡単に実施したくて、EC2上にたててみました。

サーバ側でしたこと

EC2の設定

$ sudo su
# curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash -
# sudo yum install nodejs
# node -v
v12.10.0
# npm -v
6.10.3
# npm install ws https http
  • securitygroupはssh,http,https,TCP-8080をOPEN
  • SSL用のサーバ証明書一式を/etc/ssl/certs/へコピー

Route53の設定

  • EC2インスタンスのIPアドレスをレコードセットに登録

route53

EC2上に置くWSSサーバのコード

websockets/wsのサンプルコードに一部追記しました。
今回clientはサーバから送られるのを受けとめることがメインです。

wsServer.js

const fs = require('fs');
const https = require('https');
const WebSocket = require('ws');

const server = https.createServer({
  cert: fs.readFileSync('/etc/ssl/certs/サーバ証明書'),
  ca: fs.readFileSync('/etc/ssl/certs/中間証明書'),
  key: fs.readFileSync('/etc/ssl/certs/キーファイル')
});

const wss = new WebSocket.Server({ server });

wss.on('connection', function connection(ws,req) {
    //connect時
    const ip = req.connection.remoteAddress;
    console.log('---connect from ' + ip);
    ws.send('Hello from wssServer!');

    //receive message
    ws.on('message', function incoming(message) {
        console.log(message);
    });

    //標準入力で入力したメッセージを接続中のclientに送る
    process.stdin.on('data', function (chunk) {
      var sendmessage = chunk.toString();
      ws.send(sendmessage);
    });
});

//8080ポートでサーバ待ち受け
server.listen(8080);
  • EC2インスタンス上でWSSサーバを起動させる。
    • 標準入力で入力した文字列がソケット接続中のclientに送られます
$ node wsServer.js

クライアント側

簡易テストではクライアント側はwscatを使用すると便利!

WebSocket の検証では wscat が便利だったを参考にさせていただきました!

$ npm install -g wscat

#HTTP
$ wscat -c ws://xxxx

#HTTPS
$ wscat -c wss://xxxx:8080

Route53で登録したドメインでエラーなく接続できればOK!だったのですが…

ここで正規の証明書を用いているのにerror: unable to verify the first certificateとエラーになってしまった…。

クライアント側に証明書が入ってないの?

  • クライアント:Windows上でWSL(ubuntu)を使用
$ ls /usr/share/ca-certificates/mozilla/ | grep DigiCert
DigiCert_Assured_ID_Root_CA.crt
DigiCert_Assured_ID_Root_G2.crt
DigiCert_Assured_ID_Root_G3.crt
DigiCert_Global_Root_CA.crt
DigiCert_Global_Root_G2.crt
DigiCert_Global_Root_G3.crt
DigiCert_High_Assurance_EV_Root_CA.crt
DigiCert_Trusted_Root_G4.crt

$ cat /etc/ca-certificates.conf | grep DigiCert_Global
mozilla/DigiCert_Global_Root_CA.crt
mozilla/DigiCert_Global_Root_G2.crt
mozilla/DigiCert_Global_Root_G3.crt

あれ?使いたい証明書ちゃんとクライアント側にいるやん...
と、先輩の手も借りて調査したところ、サーバ側で中間証明書を指定して起動しているつもりが、大元のルート証明書を指定して起動していたためエラーが出ているだけでした…なんと初歩的ミスorz
修正して起動しなおして無事に通ることを確認。

Node.js簡単万歳!めでたしめでたし:grin:

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3