QNetworkAccessManager ssl 握手失败
QNetworkAccessManager ssl handshake fails
我正在使用QNAM和QNetworkRequest向我们的服务器发出post请求。 在大多数机器上,它工作正常,但在某些机器上它失败了。 所有机器都运行Windows并连接到同一个Ubuntu服务器。 在两台 Windows 7 机器之间,一台工作,一台失败。 两台机器应该具有相同的 ssleay32.dll 和 libeay32.dll(我将它们包含在我的安装包中)。 将 chrome 安装到"损坏"的机器上后,它现在可以正确执行 SSL 握手。 如果我删除与我们的 CA (Thawte) 相关的所有证书(中间证书和受信任证书),SSL 握手将再次失败。
manager = new QNetworkAccessManager( this );
connect( manager, SIGNAL( finished( QNetworkReply* ) ),
this, SLOT( licenseServerReply( QNetworkReply* ) ) );
connect( manager, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)),
this, SLOT( sslErrorOccured(QNetworkReply*,QList<QSslError>))
);
request.setUrl( "https://www.myURL.com/postFromMachine/");
postData.append( "computer-name=" );
postData.append( hostInfo.hostName() );
postData.append( "&" );
manager->post( request, postData );
我已经将一个插槽连接到QNetworkRequest对象的sslErrors()信号,当SSL握手失败时,我得到以下结果:调试:"找不到本地查找的证书的颁发者证书"调试:"根 CA 证书不受此目的的信任"
为了修复丢失的证书,我在工作机器上添加了有关我们的根授权"Thawte"和相关证书"Thawte consulting"等的所有证书(中间证书和受信任证书)。 到 QSSLSocket 对象,并通过 QSSLCOnfiguration 将该对象传递给 QNAM。 总共有 9 个,似乎没有解决问题。 我在 manager->post() 之前添加了以下代码。
QSslSocket *socket = new QSslSocket( this );
socket->addCaCertificates( ":/Certs/thawte1.cer" );
socket->addCaCertificates( ":/Certs/thawte2.cer" );
// Several more certs ...
socket->addCaCertificates( ":/Certs/thawte9.cer" );
QSslConfiguration conf;
conf.setCaCertificates( socket->caCertificates() );
request.setSslConfiguration( conf );
在IRC聊天中讨论后,我被指向服务器上的以下命令,以确保它具有正确的证书链:
openssl s_client -verify 5 -CApath /etc/ssl/certs -connect www.myurl.com:443 -showcerts
它回复了[ok],没有错误。 颁发者始终是链中下一个证书的主题,并且链一直到根 CA。 除非有更多内容要检查该命令,否则对我来说似乎很好。
我还检查了以下站点上的证书链,似乎一切都很好(预计路径#2的证书可能较弱)https://www.ssllabs.com/ssltest/analyze.html
不知所措,如何证明服务器具有正确的证书链? 如果它确实具有正确的证书链,为什么不是所有计算机都正确执行握手(即我需要在应用程序中添加/更改哪些证书或设置才能使它们工作)? 我不想简单地忽略SSLErrors,因为我想100%确定我与正确的主机有加密连接。
提前感谢所有的帮助!
我将socket->addCaCertificate修改为addDefaultCaCertificate,并将它们从.cer切换到.pem(我直接从我们的服务器获得.pem文件)。 现在一切正常。 请注意,不要从服务器复制私钥,请确保它是 CA 公钥。
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- curl_easy_perform() 失败:SSL 对等证书或 SSH 远程密钥不正常
- Arduino ESP8266HTTPClient:握手失败(SSL 错误 40)
- libgit2:git_clone() 失败并出现"failed to create ssl object"错误
- vcpkg 安装失败,并显示"SSL 连接错误"
- 尝试从 c++ 运行 https 代码时,SSL 握手失败
- Qt&SSL,握手失败
- Ubuntu 中 Boost SSL 的编译失败
- QNetworkAccessManager ssl 握手失败
- 由于SSL3_GET_CLIENT_CERTIFICATE:未返回证书,验证 SSL 客户端真实性失败
- Boost SSL-Server失败,产生SSLv3-error