Qt de https (GET, POST, PUT, etc.) solicita Tiempos
qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed
de error.
entorno de desarrollo
- Windows 10 64 Wei
- 5.12.1 qt
- MSVC 2017 Compilador (versión: 15.0)
Encontrado el problema
- En el entorno de desarrollo con equipos que ejecutan ningún problema, y portado a otros sistemas, hay problemas reportados de error SSL, lo que resulta en https petición no funciona.
qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed.
análisis
- En función de los consejos de impresión de error para encontrar el código fuente correspondiente.
void QSslSocket::connectToHostEncrypted(const QString &hostName, quint16 port,
const QString &sslPeerName, OpenMode mode,
NetworkLayerProtocol protocol)
{
...
if (!supportsSsl()) {
qCWarning(lcSsl, "QSslSocket::connectToHostEncrypted: TLS initialization failed");
d->setErrorAndEmit(QAbstractSocket::SslInternalError, tr("TLS initialization failed"));
return;
}
d->init();
...
}
- Si la
supportsSsl
función de impresión vuelve falso mensaje de error (advertencia), ya no seguimiento, y luego continuar viendosupportsSsl
función.
/* 如果此平台支持SSL,则返回true;否则,返回false。
* 如果平台不支持SSL,套接字将失败在连接阶段。
*/
bool QSslSocket::supportsSsl()
{
return QSslSocketPrivate::supportsSsl();
}
bool QSslSocketPrivate::supportsSsl()
{
return ensureLibraryLoaded();
}
ensureLibraryLoaded
Conseguido.
bool QSslSocketPrivate::ensureLibraryLoaded()
{
if (!q_resolveOpenSslSymbols())
return false;
...
return true;
}
- Desde junio de Qt utilizando un sistema de ventanas para elegir
loadOpenSslWin32
a cargar funciones de biblioteca SSL.
bool q_resolveOpenSslSymbols()
{
...
#ifdef Q_OS_WIN
QPair<QSystemLibrary *, QSystemLibrary *> libs = loadOpenSslWin32();
#else
QPair<QLibrary *, QLibrary *> libs = loadOpenSsl();
#endif
if (!libs.first || !libs.second)
// failed to load them
return false;
...
loadOpenSslWin32
Conseguido.
static QPair<QSystemLibrary*, QSystemLibrary*> loadOpenSslWin32()
{
...
#if QT_CONFIG(opensslv11)
// With OpenSSL 1.1 the names have changed to libssl-1_1(-x64) and libcrypto-1_1(-x64), for builds using
// MSVC and GCC, (-x64 suffix for 64-bit builds).
#ifdef Q_PROCESSOR_X86_64
#define QT_SSL_SUFFIX "-x64"
#else // !Q_PROCESSOFR_X86_64
#define QT_SSL_SUFFIX
#endif // !Q_PROCESSOR_x86_64
tryToLoadOpenSslWin32Library(QLatin1String("libssl-1_1" QT_SSL_SUFFIX),
QLatin1String("libcrypto-1_1" QT_SSL_SUFFIX), pair);
#undef QT_SSL_SUFFIX
#else // QT_CONFIG(opensslv11)
// When OpenSSL is built using MSVC then the libraries are named 'ssleay32.dll' and 'libeay32'dll'.
// When OpenSSL is built using GCC then different library names are used (depending on the OpenSSL version)
// The oldest version of a GCC-based OpenSSL which can be detected by the code below is 0.9.8g (released in 2007)
if (!tryToLoadOpenSslWin32Library(QLatin1String("ssleay32"), QLatin1String("libeay32"), pair)) {
if (!tryToLoadOpenSslWin32Library(QLatin1String("libssl-10"), QLatin1String("libcrypto-10"), pair)) {
if (!tryToLoadOpenSslWin32Library(QLatin1String("libssl-8"), QLatin1String("libcrypto-8"), pair)) {
tryToLoadOpenSslWin32Library(QLatin1String("libssl-7"), QLatin1String("libcrypto-7"), pair);
}
}
}
#endif // !QT_CONFIG(opensslv11)
return pair;
}
- versión de Qt no está configurado
opensslv11
, por lo que después de la operación de carga de la biblioteca SSL. Con el fin de encontrarssleay32
ylibeay32
, si no lo encuentra de encontrarlibssl-10
, ylibcrypto-10
así sucesivamente hastalibssl-7
elibcrypto-7
.
if (!tryToLoadOpenSslWin32Library(QLatin1String("ssleay32"), QLatin1String("libeay32"), pair)) {
if (!tryToLoadOpenSslWin32Library(QLatin1String("libssl-10"), QLatin1String("libcrypto-10"), pair)) {
if (!tryToLoadOpenSslWin32Library(QLatin1String("libssl-8"), QLatin1String("libcrypto-8"), pair)) {
tryToLoadOpenSslWin32Library(QLatin1String("libssl-7"), QLatin1String("libcrypto-7"), pair);
}
}
}
La resolución de problemas
- Encuentra las versiones de plataforma correspondientes de la biblioteca SSL, Qt será rey
ssleay32
ylibeay32
bibliotecas en el directorio que se ejecuta bajo para resolver el problema. - Debido a que el entorno de desarrollo existe
ssleay32
ylibeay32
enlaces de trayectoria, empacadores y ninguna copia de la biblioteca SSL, lo que lleva a emigrar a otras computadoras funcionalidad SSL no está funcionando correctamente.
algunos resumen
-
biblioteca SSL se puede implementar con la aplicación, OpenSSL también se puede instalar en el equipo.
-
Dependiendo de la versión de las bibliotecas Qt SSL puede ser diferente.
-
herramienta Dependency Walker no puede encontrar bibliotecas dependientes, porque es biblioteca de ejecución cargado. Nota: Dependency Walker puede escanear cualquier de 32 bits o de 64 bits del módulo de Windows EXE, DLL, OCX, sys, etc., y construye un árbol jerárquico de todos los objetos de la figura.
-
SSL biblioteca Descargar versión de Windows:
https://slproweb.com/products/Win32OpenSSL.html
- SSL Dirección de origen:
https://github.com/openssl/openssl
- Si la versión de MinGW la biblioteca SSL se puede encontrar en la siguiente ruta (es su trayectoria real):
C:\Qt\Qt5.12.1\Tools\mingw730_64\opt\bin