我正在使用 QNAM 和 QNetworkRequest 向我们的服务器发出发布请求。在大多数机器上它工作正常,但在一些机器上它失败了。所有机器都运行 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 公钥。
关于c++ - QNetworkAccessManager ssl 握手失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27926763/