Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

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:

edapo
エンジニアに憧れる普通の会社員
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした