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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

5373閲覧

Unityでwebsocket-sharpを使ったwss通信について

k.shiho

総合スコア5

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/07/22 18:26

お世話に成ります。
Unity上でWebSocket-sharpを利用してクライアントとサーバを立てました。

やってみた事以下の組み合わせでクライアントとサーバーで通信しました。
クライアント  サーバー
unity ws   unity ws 〇
unity ws wscat ws 〇
unity wss unity wss ×
unity wss aws wss ×
wscat wss aws wss 〇
〇がconnectが成功しセッションが開設しましたものです。

unityの時だけセキュア(wss)だとどうやってもconnect時のハンドシェイクでエラーに成りそのままcloseしてしまいます。

dllにしないでプロジェクト毎unityにコピーしてデバッグした所
dohandshake→setClientStream→sslStream.AuthenticateAsClientで例外になっているみたいでした。

コード1015でTLSハンドシェイクの証明書関連エラーに見えます。
サーバーとクライアントのコードを添付します。見た感じおかしい箇所や、証明書に関する常識等ご教示いただけますでしょうか?
よろしくお願いいたします。

c#

1クライアント側 2 void Start(){ 3 _ws = new WebSocket("wss://localhost:5963"); 4 _ws.Log.Level = LogLevel.Trace; 5 _ws.SslConfiguration.ClientCertificates = new X509Certificate2Collection(){new X509Certificate2("C:/oreoreCA/サーバーの中間証明書.pem","*******")}; 6 7 _ws.OnOpen += (sender, e) =>{ 8 Debug.Log("WebSocket Open"); 9 }; 10 11 _ws.OnMessage += (sender, e) => 12 { 13 Debug.Log("WebSocket Message Type: " + e.Data + ", Data: " + e.Data); 14 }; 15 16 _ws.OnError += (sender, e) => 17 { 18 Debug.Log("WebSocket Error Message: " + e.Message); 19 }; 20 21 _ws.OnClose += (sender, e) => 22 { 23 Debug.Log("WebSocket Close"); 24 }; 25 26 _ws.Connect(); 27 }

C#

1サーバー側 2 void Awake (){ 3 var wssv = new WebSocketServer ("wss://localhost:5963"); 4 wssv.SslConfiguration.ServerCertificate = new X509Certificate2("C:/oreoreCA/中間証明書.pem","*******"); 5 6 wssv.AddWebSocketService<Echo>("/"); 7 8 wssv.Start(); 9 if (wssv.IsListening) { 10 Console.WriteLine ("Listening on port {0}, and providing WebSocket services:", wssv.Port); 11 foreach (var path in wssv.WebSocketServices.Paths) 12 Console.WriteLine ("- {0}", path); 13 } 14 15 Console.WriteLine ("\nPress Enter key to stop the server..."); 16 //Console.ReadLine (); 17 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

接続先が localhost だと失敗したが外部 URL だと接続できたという報告があります。

コード1015でTLSハンドシェイクの証明書関連エラーに見えます。

エラーコードでエラーの内容は覚えていないし、エラーメッセージについては正確なコピペでないとググれないのでこの辺は考慮していません。

投稿2020/07/23 03:11

bboydaisuke

総合スコア5270

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

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

k.shiho

2020/07/23 04:11

回答の程どうもありがとうざいました!! リンク頂いたやり取りを見て こちら https://github.com/sta/websocket-sharp/pull/491/commits/784adf60b0f5732d1918268f8af047ab89de2dc1 で解決しました! 個人的な知見が無いため、正しい事が言えてる自信がありませんが端的に connnect→dohandshake→setClientStreamと実行され その中でセキュア通信だった場合 sslStream.AuthenticateAsClientが実行されます。 ここでクライアント証明書を指定しまうとサーバーの証明書と突合せが上手くいかなかったのかな?と推測しています。 クライアント証明書を指定しない事によってこちらが実行され無事外部サイト〈awsのApiGateway)と通信できました。 slStream.AuthenticateAsClient(host); 個人的にクライアント証明書に関する知見が無いので一概にクライアント証明書を指定しないで、この修正を適用した方が良いと言えませんが wssで外部と通信する場合には有効だだと思いました。 数日悩んでましたので、この記事で大変たすかりました。 ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問