Qt项目跨Windows10/11后TLS初始化失败及OpenSSL链接问题
Windows 11下Qt 6.5项目TLS初始化失败问题排查与解决
问题描述
项目最初在Windows 10上测试一切正常,同一机器切换至Windows 11后,无法发起网络请求,持续返回"TLS initialization failed"错误。
错误日志
每次发起请求时,Qt输出以下警告:
W qt.network.ssl: unknown unknown The backend "cert-only" does not support QSslKey W qt.network.ssl: unknown unknown Active TLS backend does not support key creation W qt.network.ssl: unknown unknown The backend "cert-only" does not support QSslKey W qt.network.ssl: unknown unknown Active TLS backend does not support key creation W qt.network.ssl: unknown unknown The backend "cert-only" does not support QSslSocket W qt.network.ssl: unknown unknown The backend named "cert-only" does not support TLS W qt.network.ssl: unknown unknown QSslSocket::connectToHostEncrypted: TLS initialization failed
CMake中OpenSSL链接配置
当前项目针对Android平台的OpenSSL配置如下:
set_target_properties(${GW_LIBRARY_NAME} PROPERTIES QT_ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android) list(APPEND android_extra_libs ${CMAKE_CURRENT_SOURCE_DIR}/../assets/libs/openssl/arm64/libcrypto_1_1.so ${CMAKE_CURRENT_SOURCE_DIR}/../assets/libs/openssl/arm64/libssl_1_1.so) set_target_properties(${GW_LIBRARY_NAME} PROPERTIES QT_ANDROID_EXTRA_LIBS "${android_extra_libs}")
当前环境
- Qt 6.5
- Android NDK 25
- 测试环境:同一机器从Windows 10切换至Windows 11
注:该代码在Windows 10的其他Qt项目中可正常运行。
SSL版本检测结果
调用QSslSocket版本检测接口:
qDebug() << "My build Version String is - " << QSslSocket::sslLibraryBuildVersionString() << " " " and version string is " << QSslSocket::sslLibraryVersionString();
输出结果:
"My build Version String is - "Secure Channel (NTDDI: 0xA00000C)" and version string is "Secure Channel, Windows 10.0.18363"
解决方案建议
1. 强制Qt使用OpenSSL后端而非SCHANNEL
Qt 6在Windows默认使用系统SCHANNEL作为SSL后端,Windows 11与Win10的SCHANNEL版本差异可能导致兼容问题。可强制切换到OpenSSL:
- 下载与Qt 6.5匹配的OpenSSL 3.x预编译库,将
libssl-3.dll和libcrypto-3.dll放入项目输出目录或系统环境路径。 - 在程序启动阶段添加代码:
QSslSocket::setBackend("openssl");
2. 补充Windows平台的CMake OpenSSL配置
当前CMake仅配置了Android平台的OpenSSL,需为Windows平台添加链接逻辑:
if(WIN32) set(OPENSSL_ROOT_DIR "你的OpenSSL安装路径") find_package(OpenSSL REQUIRED) target_link_libraries(${GW_LIBRARY_NAME} PRIVATE OpenSSL::SSL OpenSSL::Crypto) endif()
3. 检查Windows 11的SCHANNEL协议设置
- 打开「设置-网络和Internet-高级网络设置-高级共享设置」,确保TLS相关协议启用。
- 运行
gpedit.msc,进入计算机配置-管理模板-网络-SSL配置设置,确认TLS 1.2/1.3等协议未被禁用。
4. 清理缓存并重新编译项目
系统切换后可能存在编译缓存兼容问题:
- 删除项目的CMake缓存和构建目录,重新生成构建文件。
- 使用适配Windows 11的编译器(如MSVC 2022)重新编译项目。
内容的提问来源于stack exchange,提问作者codeClash
相关产品推荐
相关产品推荐

