填坑日记:Windows XP 中https无法访问

好不容易捣鼓了一套支持Windows XP的Qt环境,真实工程实测时居然无法在XP(虚拟机)通过https加载远端数据。于是又折腾了好一会儿。【本文的部分调研和数据整理工作借助AI工具完成】

坑的描述 Windows XP 中https无法访问
根本原因 XP系统的数字证书过期了
填坑进度 已解决

问题描述

同样的文件包,放到win10、win11的真机都能正常运行,win 7的虚拟机也能正常运行,偏偏XP虚拟机出了问题。查看调试信息及日志,定位到QNetworkReply::canReadLine() 返回 false。在确认了远端资源可以正常访问之后,首先想到的是Qt程序在XP环境加载openssl动态库不成功(Qt环境编译使用的-openssl-runtime)。

  • 使用depends工具排查主程序及openssl库的依赖,所有依赖完整。
  • 增加相关信息输出QSslSocket::supportsSsl()、QSslSocket::sslLibraryBuildVersionString()和QSslSocket::sslLibraryVersionString(),均返回正常。
[Info]2026-07-15 11:32:25:015  -  main ( 16 ) supportsSsl: true
[Info]2026-07-15 11:32:25:015  -  main ( 17 ) OpenSSL version: OpenSSL 1.0.2u  20 Dec 2019
[Info]2026-07-15 11:32:25:015  -  main ( 18 ) Runtime version: OpenSSL 1.0.2u  20 Dec 2019
  • 使用openssl命令行测试,返回也正常。
openssl s_client -connect cnb.cool:443 -tls1_2

至此,说明Qt环境与openssl环境都没有问题。尝试获取了QNetworkReply的错误信息,指向"SSL handshake failed",这就说明不是Qt的问题,也不是openssl的问题,是XP本身的问题。

原因分析

XP系统确实只原生支持到TLS 1.0(已废弃),而现在几乎所有网站都要求使用更安全的 TLS 1.2 或 TLS 1.3,XP系统无法满足,导致连接失败。但是,Qt+openssl的组合理论上讲可以满足TLS1.2+的要求,应该还有得救。从原理上梳理一遍:

  • HTTPS 是目标:https (HyperText Transfer Protocol Secure)不是一个独立的协议,而是 HTTP 协议跑在 SSL/TLS 安全通道之上的组合。可以理解为HTTPS = HTTP + SSL/TLS。
  • SSL/TLS是手段:SSL (Secure Sockets Layer) 是 Netscape 公司开发的早期安全协议,TLS (Transport Layer Security) 是它的标准化升级版。它主要完成三件事:
    • 加密:传输的数据是加密的。
    • 完整性:数据不会被中间人篡改。
    • 身份验证:验证服务器的真实身份(证书)。
  • 数字证书是身份证:由可信的第三方机构(CA)签发,内容包含了:
    • 服务器的公钥。
    • 服务器的域名(如 example.com)。
    • 颁发者的数字签名(用于验证证书的真伪)。

再一想,Windows XP 早在2003年就退役了,所以使用XP SP3的iso制作的虚拟机环境证书的颁发日期不会晚于2003年。而SSL数字证书的有效期,一般不超过3年。所以这个环境里几乎所有的证书都过期了。

解决方案

借助AI工具的信息汇总能力,检索到一个专门干这事的开源项目:https://github.com/asheroto/UpdateRootCertificates。该项目居然只有120星。以下翻译自项目介绍。

随着旧版 Windows 系统停止支持,其内置的根证书自动更新机制常常失效。这会导致浏览器提示“证书无效”、软件安装报错,以及HTTPS 连接失败等问题。

UpdateRootCertificates 是一个专为解决旧版 Windows 系统(如 Windows XP、Vista 和 7)证书更新问题而设计的开源工具。其核心功能,是直接从微软服务器获取并安装最新的根证书,从而绕过失效的系统更新机制,重建 Windows 的证书信任存储区。

  • 无需依赖:它是一个完全自包含的工具,不需要安装 .NET Framework、certutil 等额外组件。
  • 跨平台兼容:支持从 Windows XP 到 Windows 11 的几乎所有主流 Windows 系统。
  • 工作原理:程序会下载微软官方最新的证书信任列表(CAB 文件),解析后,将证书直接写入系统的注册表存储区。
  • 离线支持:对于无法连接互联网的电脑,它支持“仅下载”模式,你可以在联网的机器上下载好所有证书,再拷贝到目标机器上进行安装。

实测大约检查/更新了500项数字证书。更新完重启计算机后,问题得到解决。

题外话

同时记录一下Windows 7出现类似问题的解决方法:安装系统补丁KB4474419。在页面中,根据你的 Windows 7 是 32位 (x86) 还是 64位 (x64),选择对应的补丁包下载安装即可。

 

二零二六年七月十五日 顾毅写于厦门