質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Q&A

1回答

9563閲覧

Socket.IOサーバーと外部のWebサーバーでSSL通信するには?

buibui80

総合スコア1033

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

0グッド

1クリップ

投稿2015/09/24 07:00

編集2015/09/24 07:01

Socket.IOサーバーとWebサーバーを2台のサーバーで個別に動作させているのですが、
Socket.IOサーバーとSSL通信する方法が分かりません。
構成は以下の通りです。

Socket.IOサーバー
自宅PCにてSocket.IOサーバーを動作させています。
サンプルによくあるWebサーバーとの組み合わせでなくSocket.IO単体で動作しています。

Webサーバー
レンタルサーバー(ロリポップ)にてHTTPSでWebページを表示しています。
Webページ内にSocket.IOサーバーに接続するコードが書かれています。

Webサーバー側がHTTPSで表示されていれば
Socket.IOサーバーは特に何もせずともSSL通信になるなら問題ないですが、
そうでない場合どのようにすればSocket.IOサーバーとSSL通信できるかご教授頂けないでしょうか?

SSLを使用しない場合に問題なく動作していることは確認しています。
どうぞ宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

WebSocketのセキュリティ面での質問かと思います。
WS(ws://)プロトコルでなく、WSS (wss:// WebSocket secure: WS over SSL/TLS)でコネクションを確立する。これはHTTPに対するHTTPSと同じです。WebSocketの接続を確立するまえにハンドシェイクが必要ですが、これはHTTPでハンドシェイクを行った場合であっても、 WSS、WS いずれのプロトコルも利用できるようです。

ただし、HTTPSでハンドシェイクを行った場合は、WSS(WebSocket secure)しか利用できません。セキュリティレベルの格下げができないためです。

最近のバージョンのsocket.ioではデフォルトでWSSを利用するようになっているようです。以前はセキュアオプション{secure: true}がありましたが廃止されています。

そのため、HTTPSでハンドシェイクを行う場合は下記でWSSを利用できます。

javascript

1var socket = io.connect('//localhost'); 2 3// あるいは 4var socket = io.connect('https://localhost');

▼参考
node.js, socket.io with SSL

投稿2015/12/31 04:20

bleurouge

総合スコア161

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

buibui80

2015/12/31 06:12

ご回答ありがとうございます! ・クライアント(Webページ)がHTTPの時、WSS、WSのどちらも利用できる。 ・クライアント(Webページ)がHTTPSの時、WSSのみ利用できる。 と理解しました。 ということは、 「WebページがHTTPSで表示されていればSocket.IOサーバーは特に何もせずともSSL通信になる」という認識は誤りで、 WSSを使用するにはSocket.IOサーバ側での作業が必須となり、 その作業が「Socket.IOサーバー起動時にSSL証明書を設定」ということで良いでしょうか? よろしくお願いいたします。
bleurouge

2015/12/31 12:11

Socket.IOサーバー(自宅)、Webサーバー(ロリポッップ)という環境でのセキュアな接続という点が質問内容のポイントみたいですね。少し興味があって調べてみましたが、ここから先は私の推測も含みますので、その点ご了承ください。 私の認識では以下のとおりです。 ※SSLサーバ証明書の有無が、WebSocketプロトコルのセキュアな通信には関係ない。  つまり、SSL証明書の鍵を利用してWebSocketのセキュアな通信を行うわけではない。  ハンドシェイクがHTTPであってもWebSocket通信はセキュアになる。 以下がその説明部分になります。 1. WebSocketの接続の確立はクライアント(Webページに限らず)からのハンドシェイクで始まる Client Handshake Request========== GET /chat HTTP/1.1 Host: example.com:8000 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13 ============================== 2. WebSocket(socket.io)サーバからのレスポンスにはSec-WebSocket-Acceptという形でサーバ証明書によるところの鍵を載せてレスポンスを返す ※WebSocketサーバーはクライアントから送られてきたSec-WebSocket-Key(dGhlIHNhbXBsZSBub25jZQ==)と"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"(これはマジックナンバーらしい)を文字連結してSHA-1 hashを取り、base64 エンコーディングして Sec-WebSocket-Accept を生成する、らしいです。 Server Handshake Response======== HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= ============================== 3. Sec-WebSocket-Acceptのキーを使い、WSSの暗号化通信を行う(下記参考リンクRFC6455 — The WebSocket Protocolの5からが詳しい感じ) ちなみに、WebSocketでのセキュアな接続は同一生成元を前提としている。WebSocketサーバは自分と異なる生成元からのリクエストには拒否すべき。 ※ 以上から、buibui80さんのケースでは、WebSocket通信のセキュリティという観点だと、SSL証明書の有無よりも、Socket.IOサーバー(自宅)の 同一生成元ポリシーに、Webサーバー(ロリポップ)socket.ioクライアントからの接続を許可してあげることが必要になるかと思います。また、ハンドシェイクを確立する際(暗号化キーのやり取り)もHTTPSであれば、よりセキュリティは高いと言えます。 詳しい内容はRFC6455のドキュメントを読み込んでもらった方が早いかもしれないです。 ////////// ▼参考 ・RFC6455 — The WebSocket Protocolの日本語ドキュメントが存在しています http://www.hcn.zaq.ne.jp/___/WEB/RFC6455-ja.html#section-4.2.2 ・Writing WebSocket servers こちらが分かりやすいです https://developer.mozilla.org/ja/docs/WebSockets-840092-dup/Writing_WebSocket_servers
bleurouge

2015/12/31 12:34

あともう一つ、Webサーバー(ロリポップ)がどのような構成かわかりませんが、WebSocketの接続を確立するまで、こちらをsocket.ioサーバとして利用する方法もありそうですね。 Socket.IOサーバー(自宅) ↓Socket.IOサーバはクライアントとしてHTTPSで接続しにいく Webサーバー(ロリポップ) ※Node.js + socket.ioとかでコネクション確立まで担う ========== Webサーバー(ロリポップ) ↓↑ WebSocketによるコネクション確立後はSocket.IOサーバが本来の役割を担う    Socket.IOサーバはWebサーバと確立したコネクションを利用してデータを流す Socket.IOサーバー(自宅)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問