Socket.IO C++ Client over HTTPS
先日投稿したSocket.IO C++ Clientが早くもTLSに対応しました。これでHTTPSを使ったセキュアな通信が可能になります。
Release 1.4.0 Release · socketio/socket.io-client-cpp · GitHub
前提
- OS X Yosemite 10.10.3
- Node.js 0.12.2
- Socket.IO 1.3.5(サーバ側) Socket.IO C++ Clientを利用するにはver1.0以降が必須です。
- Socket.IO C++ Client 1.4.0 + α 以下sio(C++のnamespaceより)と省略
sioのインストール方法の変更点
- コンパイル方法自体は前回と変わりませんが、OpenSSLを利用するようになりました。sioのコンパイル前にOpenSSL(と開発用パッケージ)をインストールしておいてください。
- make install まで終わると build/lib/Release/libsioclient_tls.aなるファイルができています。
サンプルアプリケーションの変更点
以前のサンプルプログラムもTLSに対応しました。
llamerada-jp/socket.io-cpp-client-sample · GitHub
- TLSを利用するにはコンパイル時にlibsioclient.aでなくlibsioclient_tls.aをリンクします。cmakeなどのビルド環境を変更します。起動オプションをみてENABLE_SSLが指定された場合はlibsioclient_tls.aを利用し、OpenSSLのライブラリをリンクするようにしています。
if (NOT ENABLE_SSL) list(APPEND extra_libs "sioclient") else() list(APPEND extra_libs "sioclient_tls") find_package(OpenSSL) list(APPEND extra_libs ${OPENSSL_LIBRARIES}) endif()
cmakeへは以下のようにオプションを指定します。
$ cmake -D SIO_DIR=<sioを設置したディレクトリ>/socket.io-client-cpp/build \ -D BOOST_ROOT=/usr/local/Cellar/boost/1.58.0/ \ -D ENABLE_SSL=on ..
$ ./client https://localhost:8000/ <マシン名>
サンプルサーバの変更点
以下のページを参考にサンプルプログラムを変更しました。
try catch and ...release: 自前認証局でSSL対応なNode.jsサーバアプリ
// index.js var app = require('express')(); var server = require('http').Server(app); var io = require('socket.io')(server); server.listen(8000);
↓
// index.js var fs = require('fs'); var app = require('express')(); var server; if (process.env.ENABLE_SSL) { // SSL通信路を作成 server = require('https').Server({ key: fs.readFileSync('server.key'), cert: fs.readFileSync('server.crt'), ca: fs.readFileSync('ca.crt'), requestCert: true, rejectUnauthrized: false }, app); console.log('enable ssl'); } else { // 非SSL通信路を作成 server = require('http').Server(app); } var io = require('socket.io')(server); server.listen(8000);
手順1, 2で作られるca.crt, server.key, server.crtをwebフォルダに格納し、起動時に環境変数ENABLE_SSLを設定するとhttpsで待受を開始します。
$ ENABLE_SSL nade index.js
ブラウザでアクセスする際にhttp://localhost:8000/では接続に失敗し、https://localhost:8000/で接続できるはずです。