2012-02-03 11 views
10

Tengo una aplicación Qt QWebKit que necesita usar HTTPS para hablar con páginas web. He descargado el QtSDK, así como los binarios de OpenSSL (from here).¿Cómo puedo distribuir OpenSSL con mi aplicación Qt WebKit en Windows?

Mi problema radica en la implementación de mi aplicación. Copié los archivos pertinentes de Qt DLL, así como los archivos relevantes de OpenSSL DLL (libeay32.dll y ssleay32.dll) en el directorio de mi aplicación, pero cuando intento acceder a páginas web HTTPS desde mi aplicación, ¡falla! La aplicación no falla, pero la página está en blanco. Las páginas HTTP regulares funcionan perfectamente bien.

Está claro que hay un error con respecto a la forma en que estoy distribuyendo OpenSSL con mi aplicación, no estoy seguro de dónde me estoy equivocando.

No me gustaría empaquetar el instalador de OpenSSL con mi aplicación.

+1

¿Está seguro de que está revisando las devoluciones de errores de OpenSSL en todos los sitios de llamadas y potencialmente iniciando sesión o mostrando resultados de error inesperados? Podría imaginar fácilmente un almacén de certificados faltante o una fecha/hora no válida en un sistema que causa errores de validación de la cadena de certificados que podrían no aparecer durante las pruebas "normales" ... – sarnold

+0

Este es un buen punto. He leído en otro lugar que los errores OpenSSL no controlados pueden hacer que se detenga la carga de páginas HTTPS. En mi caso, estaba manejando todos los errores de OpenSSL (ignorándolos), pero mi manejador de errores nunca fue llamado por mi QNetworkManager. –

Respuesta

5

Hola a todos los que estén leyendo esto tratando de resolver problemas similares. El problema era que los archivos binarios de OpenSSL DLL distribuidos por Shining Light Productions requieren que los redistribuibles de Visual C++ funcionen correctamente.

Para distribuir DLL OpenSSL con su aplicación sin tener que distribuir también los Redistribuibles de Visual C++, puede compilar OpenSSL usted mismo usando MinGW. Las instrucciones para compilar OpenSSL con MinGW se incluyen en la distribución de origen de OpenSSL.

Es posible que necesite distribuir la DLL MinGW con su aplicación si hace esto. Esto no fue un problema para mí desde que compilé la aplicación Qt con MinGW en primer lugar.

+0

Muchas gracias, eso me funciona: construí OpenSSL con mingw, y el problema se solucionó. – Anastasia

2

¿Se puede intentar ignorar el certificado SSL?

Archivo de cabecera:

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

Constructor:

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

Método definición:

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(); 
} 
} 

Para obtener más información, por favor ver el ejemplo QT HTTP.

+0

Este es un buen punto. Todos deberían manejar los errores de SSL si pretenden usar HTTPS en un QWebView. Esta no fue la fuente de mi problema, ¡pero es un buen consejo a pesar de todo! –

Cuestiones relacionadas