[問題] 請問關於SSL斷線的問題

看板C_and_CPP作者 (LOUIS￾N)時間7年前 (2016/11/11 17:45), 7年前編輯推噓0(0016)
留言16則, 3人參與, 最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) Win 7 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) VC++ 2015 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) QT 5.6.0 and libwebsocket 1.7.0 問題(Question): 我個別使用了 Qt 跟 libwebsocket 寫了一支Server程式 並使用這兩個Library的 官方範例html程式(用Chrome開啟) 使用SSL模式 去連Server 上述的兩個Server跟兩個Client 不論是如何排列組合 發生的情況都是 立刻顯示斷線訊息 但是如果關閉SSL的話 則是運作正常 但是有一個特殊情形 首先先開啟上述的其中一個Server程式後 並在Chrome開啟一個新分頁 在網址列打入 https://localhost:1234 Chrome會顯示 "您的連線不是私人連線" 的提示網頁 點選 "進階" 再點選 "繼續前往 localhost 網站 (不安全)" 此時Chrome的新分頁顯示 "localhost 頁面無法正常運作" 這時再去開啟上述的任一個Client網頁 就完全正常運作了 但是若是 進去Chrome的 "設定" 再點選 "清除瀏覽資料" 後 一切的情形 就恢復成 一連馬上就斷線的情形 我查了很久 都沒有發現原因 或是解決方法 請問各位前輩 可以給我一點方向或是線索嗎?? 謝謝大家 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.34.160.71 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1478857506.A.DAD.html ※ 編輯: pleaselouis (1.34.160.71), 11/11/2016 17:46:28

11/11 18:27, , 1F
當然阿 你以為chrome讓你繼續前往的網頁是安全的嗎
11/11 18:27, 1F

11/11 18:28, , 2F
他揪出來你SSL憑證不對 繼續進去就是走沒SSL的port 80
11/11 18:28, 2F

11/11 18:29, , 3F
他記下來這個例外 下次就讓你直接走port 80
11/11 18:29, 3F

11/11 18:30, , 4F
清掉資料 就走https 於是馬上斷線
11/11 18:30, 4F

11/11 18:30, , 5F
你的SSL根本從來就沒好過
11/11 18:30, 5F
不好意思 再請教一下 我的Server Listen的port是1234 照MOONRAKER先生的說法是 Chrome讓Client走port 80去連我的server 這樣為什麼會正常運作呢?? 麻煩你指導一下 謝謝 ※ 編輯: pleaselouis (180.218.142.121), 11/11/2016 18:55:24

11/11 20:17, , 6F
Http 預設 port 是 80
11/11 20:17, 6F
所以請問是 即使我的Server Listen的是 port 1234 只要是 websocket 就一定會監聽 port 80 嗎?? 麻煩請各位前輩解惑 謝謝 ※ 編輯: pleaselouis (180.218.142.121), 11/11/2016 21:10:03

11/12 00:17, , 7F
為什麼要用 libwebsocket, Qt 就有帶 QWebSocket 了啊XD
11/12 00:17, 7F
因為其實我是接手別人的Code

11/12 04:48, , 8F
你socket聽哪裡跟你網頁怎麼開有什麼關係
11/12 04:48, 8F

11/12 04:49, , 9F
就算你用port 1234進https page 憑證不對一樣dropback
11/12 04:49, 9F

11/12 04:49, , 10F
回port 80
11/12 04:49, 10F

11/12 04:51, , 11F
你問題就是在前端的html page走https必死
11/12 04:51, 11F

11/12 04:52, , 12F
你可以不用聽 反正福特都說了 沒有做錯事無法學習
11/12 04:52, 12F

11/12 04:52, , 13F
錯多一點可以學習比較久
11/12 04:52, 13F
我不是不聽 我是真的不懂 我對網路這一塊真的是新手 所以有很多疑問 如果MOONRAKER先生願意的話 可不可以多說一點相關知識讓我學習 拜託你幫忙 謝謝你 另外你提到 我的SSL憑證不對 我昨晚有做過以下測試 下面有我建構子的原始碼 原始碼 大部分是參考官方範例 引用自下述網址 http://doc.qt.io/qt-5/qtwebsockets-sslechoserver-sslechoserver-cpp.html --- m_pWebSocketServer = new QWebSocketServer(QStringLiteral("SSL Echo Server"), QWebSocketServer::SecureMode,this); QSslConfiguration sslConfiguration; QFile certFile(QStringLiteral("server.crt")); QFile keyFile(QStringLiteral("server.key")); qDebug()<<"server.crt"<<certFile.exists(); qDebug()<<"server.key"<<keyFile.exists(); //這邊我使用了QFile的exists() 來確認憑證檔案 是否存在 log顯示都為true certFile.open(QIODevice::ReadOnly); keyFile.open(QIODevice::ReadOnly); QSslCertificate certificate(&certFile, QSsl::Pem); std::string strPass = "pass"; //這個憑證檔 是沿用以前的人用過的 所以密碼應該是沒有錯 QByteArray thePwd = QByteArray::fromStdString(strPass); QSslKey sslKey(&keyFile, QSsl::Rsa, QSsl::Pem , QSsl::PrivateKey ,thePwd); //我有去查輸入憑證密碼的文件 應該沒有使用錯誤 請問是我搞錯使用方法嗎? certFile.close(); keyFile.close(); qDebug()<<"sslKey isNUll:"<<sslKey.isNull(); //這邊印出 檢查sslKey是不是NULL 印出結果是 false QList<QSslCertificate> listTest; listTest.push_back(certificate); qDebug()<<"verify:"<<QSslCertificate::verify(listTest , QString("localhost")); /*這段是我測試Code最大的問題 這個API的第2個參數 根據文件要我填host name 文件網址: http://doc.qt.io/qt-5/qsslcertificate.html#verify 請問對於憑證檔來說 他的hostname是什麼?? 我昨晚試了許多字串 感覺都是錯的 因為上面這行不論我使用什麼字串 我印的log 都是如下: "The certificate is self-signed, and untrusted" 上述的文字 google後查到:https://goo.gl/SgQOA4 根據上述文章所述 應該只是此憑證不安全 但應該可以使用?? 煩請了解的前輩 指導一下小弟 是憑證在這邊就已經告知我不能使用了嗎??*/ sslConfiguration.setPeerVerifyMode(QSslSocket::VerifyNone); sslConfiguration.setLocalCertificate(certificate); sslConfiguration.setPrivateKey(sslKey); sslConfiguration.setProtocol(QSsl::TlsV1SslV3); m_pWebSocketServer->setSslConfiguration(sslConfiguration); if (m_pWebSocketServer->listen(QHostAddress::Any, port)) { //下面我連結了 所有我能找到的singal 看是否可以得到一些資訊 //不過都未收到 任何訊息 qDebug() << "SSL Echo Server listening on port" << port; connect(m_pWebSocketServer, &QWebSocketServer::newConnection, this, &TestWebServer::onNewConnection); connect(m_pWebSocketServer, &QWebSocketServer::sslErrors, this, &TestWebServer::onSslErrors); connect(m_pWebSocketServer, &QWebSocketServer::peerVerifyError, this, &TestWebServer::onPeerVerifyError); connect(m_pWebSocketServer, &QWebSocketServer::serverError, this, &TestWebServer::onServerError); connect(m_pWebSocketServer, &QWebSocketServer::acceptError, this, &TestWebServer::onAcceptError); connect(m_pWebSocketServer, &QWebSocketServer::originAuthenticationRequired, this, &TestWebServer::onOriginAuthenticationRequired); connect(m_pWebSocketServer, &QWebSocketServer::closed, this, &TestWebServer::onClosed); } --- 再次拜託版上各位前輩 可以給小弟指導 小弟是真的不懂 謝謝大家 ※ 編輯: pleaselouis (180.218.142.121), 11/12/2016 08:08:58

11/12 09:11, , 14F
你的問題是沒搞懂 HTTPS 和 WSS 的運作原理, SSL 模式是
11/12 09:11, 14F

11/12 09:12, , 15F
用來讓使用者確認伺服器真的是你所宣稱的那個人, 這需要
11/12 09:12, 15F

11/12 09:12, , 16F
第三方認證才能辦到, 不是你想用就能用的
11/12 09:12, 16F
感謝連日以來 各位前輩的教導 我已經上網閱讀了SSL的基礎文件 http://www.study-area.org/tips/certs-v2-20020914/certs.html 終於了解 原來是我的 憑證並未加入到我local端的信任清單中 當然也沒有 加入第三方受信任的認證清單中 後來去翻前人的Code 才知道原來之前是使用憑證管理工具 來作憑證的安裝與反安裝 https://msdn.microsoft.com/zh-tw/library/e78byta0(v=vs.90).aspx 謝謝大家的指導 ※ 編輯: pleaselouis (1.34.160.71), 11/14/2016 11:19:26
文章代碼(AID): #1O9PCYsj (C_and_CPP)