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::connectに渡すURLをhttp://〜からhttps://〜にします。サンプルプログラムではURLはコマンドライン引数で指定していたので、起動方法が以下のように変わります。
$ ./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/で接続できるはずです。