2012-02-03 23 views
10

我有一个基于Qt QWebKit的应用程序需要使用HTTPS与网页交谈。我已经下载了QtSDK以及OpenSSL二进制文件(from here)。如何将基于Qt WebKit的应用程序分发OpenSSL到Windows?

我的问题在于部署我的应用程序。我已经将相关的Qt DLL文件以及相关的OpenSSL DLL文件(libeay32.dllssleay32.dll)复制到我的应用程序目录中,但是当我尝试从我的应用程序中访问HTTPS网页时,它将失败!该应用程序不会崩溃,但该页面是空白的。普通的HTTP页面工作得很好。

很明显,我的应用程序如何分发OpenSSL存在错误,我只是不确定自己出错的位置。

我真的不想将OpenSSL安装程序与我的应用程序捆绑在一起。

+1

您确定您正在检查所有呼叫站点的OpenSSL错误返回,并且可能记录日志或以其他方式显示意外的错误结果吗?我很容易想象到系统中缺少证书存储或者无效的日期/时间,导致证书链验证错误在“正常”测试期间可能不会弹出... – sarnold 2012-02-03 00:44:50

+0

这是一个很好的观点。我在其他地方看过,未处理的OpenSSL错误会导致加载HTTPS页面暂停。在我的情况下,我处理所有OpenSSL错误(通过忽略它们),但错误处理程序从未被我的QNetworkManager调用。 – 2012-02-08 23:19:41

回答

5

大家好,有人读过这个试图调试类似的问题。问题是由Shining Light Productions分发的OpenSSL DLL二进制文件需要Visual C++可再分发版才能正常运行。

若要将OpenSSL DLL与应用程序一起分发,而不必分发Visual C++可再发行组件,则可以使用MinGW自己编译OpenSSL。使用MinGW编译OpenSSL的说明包含在OpenSSL源代码分发中。

如果您这样做,您可能需要将MinGW DLL与应用程序一起分发。这对我来说不是问题,因为我首先通过MinGW与Qt应用程序进行编译。

+0

非常感谢,对我有用:我用mingw构建了OpenSSL,问题已修复。 – Anastasia 2012-10-24 09:01:13

2

可以尝试忽略ssl证书吗?

头文件

void sslErrors(QNetworkReply*,const QList<QSslError> &errors); 

构造:

connect(&qnam, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)), 
     this, SLOT(sslErrors(QNetworkReply*,QList<QSslError>))); 

方法定义:

void HttpWindow::sslErrors(QNetworkReply *reply, const QList<QSslError> &errors) 
{ 
QString errorString; 
foreach (const QSslError &error, errors) { 
    if (!errorString.isEmpty()) 
     errorString += ", "; 
    errorString += error.errorString(); 
} 

if (QMessageBox::warning(this, tr("HTTP"), 
          tr("One or more SSL errors has occurred: %1").arg(errorString), 
          QMessageBox::Ignore | QMessageBox::Abort) == QMessageBox::Ignore) { 
    reply->ignoreSslErrors(); 
} 
} 

欲了解更多信息,请参阅您的QT HTTP的例子。

+0

这是一个很好的观点。如果他们打算在QWebView中使用HTTPS,每个人都应该处理SSL错误。这不是我问题的根源,但不管怎样,这都是很好的建议! – 2012-02-08 23:20:38

相关问题