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

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

ただいまの
回答率

90.12%

ローカルPC上のSuperWebSocketサーバに対してブラウザ空行からwssでの接続ができない。

受付中

回答 1

投稿

flag 質問者が2日前に「まだ回答を求めています」と言っています。

  • 評価
  • クリップ 0
  • VIEW 60

前提・実現したいこと

C#で作成したローカルPC上で動作するアプリケーションを
SuperWebSocketサーバとし、
Webブラウザから上記ローカルアプリケーションに対して
WebSocketでメッセージのやり取りをする仕組みを作成したく、
ブラウザからアクセスする際、
ws://localhost:xxxx/で通信することはできているのですが、
wss://localhost:xxxx/ とURLを変更すると、
接続を試みるようですが、
「WebSocket connection to 'wss://localhost/' failed: WebSocket opening handshake timed out」
となり、接続が確立されません。

SSL証明書周りが起因なのかと疑っているのですが、
具体的にどのような対処をすべきかが不明で困っています。
お知恵をお借りできませんでしょうか?

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

-----------------<ブラウザ側のjavascript>-----------------
try {

switch (support) {
case "WebSocket":
ws = new WebSocket('wss://localhost:443/');
break;
case "MozWebSocket":
ws = new MozWebSocket('wss://localhost:443/');
break;
}

ws.AllowUnstrustedCertificate = true; // 信頼されない検証を通す

// イベントハンドラの登録
ws.onmessage = function (evt) {
var json = evt.data;
var data = JSON.parse(json);
onmessageFunc(data["xxxx"]);
};

ws.onopen = function () {
console.log('* Connection open');
if (typeof callbackFunc != "undefined") {
callbackFunc(ws, "open");
}
};

ws.onclose = function () {
console.log('* Connection closed');
if (typeof callbackFunc != "undefined") {
callbackFunc(null, "close");
}
}

-----------------<受け取り側のソース(C#)>-----------------
//コンフィグオブジェクト作成
var rootConfig = new SuperSocket.SocketBase.Config.RootConfig();
var serverFactory = new SuperSocket.SocketEngine.SocketServerFactory();
var serverConfig = new SuperSocket.SocketBase.Config.ServerConfig();

serverConfig.Port = 443;
serverConfig.Ip = "Any";

serverConfig.Mode = SocketMode.Tcp;
serverConfig.Name = "SuperWebSocket Sample Server";
serverConfig.MaxConnectionNumber = 100;

/* このあたりは証明書周りかと思い色々やってみたが効果でず。 */
/* serverConfig.Security = "Tls"; */
/*
serverConfig.Certificate = new CertificateConfig
{
FilePath = "certificate.pem",
ClientCertificateRequired = true
};
*/

//サーバーオブジェクト作成&初期化
server = new SuperWebSocket.WebSocketServer();
server.Setup(rootConfig, serverConfig, serverFactory);

//イベントハンドラの設定
//接続
server.NewSessionConnected += HandleServerNewSessionConnected;
//メッセージ受信
server.NewMessageReceived += HandleServerNewMessageReceived;
//切断        
server.SessionClosed += HandleServerSessionClosed;

//サーバー起動
Console.WriteLine("Start!");
server.Start();
frm.add_log(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "開始");
}
catch (Exception ex)
{
MessageBox.Show("アプリケーション起動に失敗しました。");
Application.Exit();
}
//接続
static void HandleServerNewSessionConnected(SuperWebSocket.WebSocketSession session)
{
Console.WriteLine("Connected!!");
//メッセージ送信
session.Send("aaa");

frm.session_ary.Add(session.SessionID, session);

frm.Invoke((MethodInvoker)delegate ()
{
frm.add_log(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "接続");
});
}

//メッセージ受信
static void HandleServerNewMessageReceived(SuperWebSocket.WebSocketSession session,
string e)
{
Console.WriteLine("Received: " + e);

//メッセージ送信
session.Send("[" + e + "]OK!");

frm.Invoke((MethodInvoker)delegate ()
{
frm.add_log(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "Received: " + e);

});
}

//切断
static void HandleServerSessionClosed(SuperWebSocket.WebSocketSession session,
SuperSocket.SocketBase.CloseReason e)
{
Console.WriteLine("Closed...");

frm.session_ary.Remove(session.SessionID);
frm.Invoke((MethodInvoker)delegate ()
{
frm.add_log(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "切断");
});

//サーバー終了
//session.AppServer.Stop();
}

private void button1_Click(object sender, EventArgs e)
{
server.Stop();
this.Close();
}

public void add_log(string time, String log)
{
log = "[" + time + "] " + log + "\r\n";
textBox1.AppendText(log);
}

private static Boolean RemoteCertificateValidationCallback(Object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None)
{
return true;
}

return false;
}        }

試したこと

ブラウザ(chrome,IE11,Edge すべてで同じ事象が起きます。)
ブラウザからのURLをws:にすると問題なく動作します。

補足情報(FW/ツールのバージョンなど)

開発ツール:VisualStudio2017 側にて
SuperWebSocketを利用

Web側はNaviveなHTMLにJavaScriptのみ

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

stackoverflowには「pem を pfx に変換せよ」と書いてあるけどこれかな?
とりあえずなら stone で tls proxy を作って包んでやればよさそう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/15 10:52

    ご返信ありがとうございます。

    pfxにして試してみましたが、残念ながら結果は同じでした。
    ----<ブラウザ側のjavascript>-----
    ws = new WebSocket('wss://localhost:443/');
    ここでタイムアウトが起きます。
    そもそも当該URLに疎通する際に
    ロジック上、秘密鍵を渡していないように思ってるのですが、
    そのあたりを疑ってみます。


    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • C#に関する質問
  • ローカルPC上のSuperWebSocketサーバに対してブラウザ空行からwssでの接続ができない。