Desarrollo Diario | resuelve el problema de la falta de la biblioteca SSL condujo al fracaso de https

Qt de https (GET, POST, PUT, etc.) solicita Tiempos qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failedde 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

  1. 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();
    ...
}
  1. Si la supportsSslfunción de impresión vuelve falso mensaje de error (advertencia), ya no seguimiento, y luego continuar viendo supportsSslfunción.
/* 如果此平台支持SSL,则返回true;否则,返回false。
 * 如果平台不支持SSL,套接字将失败在连接阶段。 
 */
bool QSslSocket::supportsSsl()
{
    return QSslSocketPrivate::supportsSsl();
}

bool QSslSocketPrivate::supportsSsl()
{
    return ensureLibraryLoaded();
}
  1. ensureLibraryLoadedConseguido.
bool QSslSocketPrivate::ensureLibraryLoaded()
{
    if (!q_resolveOpenSslSymbols())
        return false;
    ...
    return true;
}
  1. Desde junio de Qt utilizando un sistema de ventanas para elegir loadOpenSslWin32a 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;

    ...
  1. loadOpenSslWin32Conseguido.
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;
}
  1. 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 encontrar ssleay32y libeay32, si no lo encuentra de encontrar libssl-10, y libcrypto-10así sucesivamente hasta libssl-7e libcrypto-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 ssleay32y libeay32bibliotecas en el directorio que se ejecuta bajo para resolver el problema.
  • Debido a que el entorno de desarrollo existe ssleay32y libeay32enlaces 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
Publicados 354 artículos originales · ganado elogios 80 · Vistas de 150.000 +

Supongo que te gusta

Origin blog.csdn.net/nicai_xiaoqinxi/article/details/103928124
Recomendado
Clasificación