我正在使用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证书”
为了修复丢失的证书,我在工作机器上添加了有关我们的Root Authority“Thawte”和相关证书“Thawte consulting”等的所有证书(中间和可信)到QSSLSocket对象并传递了该对象通过QSSLCOnfiguration到QNAM。总共有9个,似乎没有解决问题。我在manager-&gt; 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%确定我与正确的主机有加密连接。
提前感谢所有帮助!
答案 0 :(得分:0)
我将socket-&gt; addCaCertificate修改为addDefaultCaCertificate并将它们从.cer切换到.pem(我直接从我们的服务器获取.pem文件)。现在一切都很好。请注意,请勿从服务器复制私钥,确保它是CA公钥。