はじめに
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アドレスをレコードセットに登録
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簡単万歳!めでたしめでたし