c++ - QNetworkAccessManager ssl 握手失败

标签 c++ qt ssl ssl-certificate qnetworkaccessmanager

我正在使用 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/

相关文章:

php - T_CONSTANT_ENCAPSED_STRING

c++ - 如何将格式长值 20010203 转换为字符串 2001-02-03?

c++ - 删除链表中的节点 - 段错误

c++ - gcc v10 和 v9 : bug or feature 之间的 constexpr 差异

c++ - 简单的文档切换器功能?

c++ - Qprocess 弄乱了我的 linux 命令(我认为)。怎么修?

java - Apache HttpClient 在 macOS 上使用 Java 11 失败

c++ - 制作网页小程序的工具

css - 使用 CSS 设计 QPushButton 样式?

ssl - 发送 HTTP 请求时出错。 (无法从 mule HTTPS 连接到 openAM)