作者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/cn.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