QNetworkAccessManager ssl 握手失败

QNetworkAccessManager ssl handshake fails

本文关键字:失败 ssl QNetworkAccessManager      更新时间:2023-10-16

我正在使用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 公钥。