作者pleaselouis (LOUISN)
看板C_and_CPP
標題[問題] 請問關於SSL斷線的問題
時間Fri Nov 11 17:45:03 2016
開發平台(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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1478857506.A.DAD.html
※ 編輯: pleaselouis (1.34.160.71), 11/11/2016 17:46:28
1F:→ MOONRAKER: 當然阿 你以為chrome讓你繼續前往的網頁是安全的嗎 11/11 18:27
2F:→ MOONRAKER: 他揪出來你SSL憑證不對 繼續進去就是走沒SSL的port 80 11/11 18:28
3F:→ MOONRAKER: 他記下來這個例外 下次就讓你直接走port 80 11/11 18:29
4F:→ MOONRAKER: 清掉資料 就走https 於是馬上斷線 11/11 18:30
5F:→ MOONRAKER: 你的SSL根本從來就沒好過 11/11 18:30
不好意思 再請教一下 我的Server Listen的port是1234
照MOONRAKER先生的說法是 Chrome讓Client走port 80去連我的server
這樣為什麼會正常運作呢?? 麻煩你指導一下 謝謝
※ 編輯: pleaselouis (180.218.142.121), 11/11/2016 18:55:24
6F:→ CodingMan: Http 預設 port 是 80 11/11 20:17
所以請問是 即使我的Server Listen的是 port 1234
只要是 websocket 就一定會監聽 port 80 嗎?? 麻煩請各位前輩解惑 謝謝
※ 編輯: pleaselouis (180.218.142.121), 11/11/2016 21:10:03
7F:→ uranusjr: 為什麼要用 libwebsocket, Qt 就有帶 QWebSocket 了啊XD 11/12 00:17
因為其實我是接手別人的Code
8F:→ MOONRAKER: 你socket聽哪裡跟你網頁怎麼開有什麼關係 11/12 04:48
9F:→ MOONRAKER: 就算你用port 1234進https page 憑證不對一樣dropback 11/12 04:49
10F:→ MOONRAKER: 回port 80 11/12 04:49
11F:→ MOONRAKER: 你問題就是在前端的html page走https必死 11/12 04:51
12F:→ MOONRAKER: 你可以不用聽 反正福特都說了 沒有做錯事無法學習 11/12 04:52
13F:→ MOONRAKER: 錯多一點可以學習比較久 11/12 04:52
我不是不聽 我是真的不懂 我對網路這一塊真的是新手 所以有很多疑問
如果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
14F:→ uranusjr: 你的問題是沒搞懂 HTTPS 和 WSS 的運作原理, SSL 模式是 11/12 09:11
15F:→ uranusjr: 用來讓使用者確認伺服器真的是你所宣稱的那個人, 這需要 11/12 09:12
16F:→ uranusjr: 第三方認證才能辦到, 不是你想用就能用的 11/12 09:12
感謝連日以來 各位前輩的教導 我已經上網閱讀了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