捉虫记:QT5.2 SSL握手失败问题

最近在测试项目的时候,出现了这样一个bug:在某些win7和 win8主机上,我们的客户端使用paypal进行付款时,出现SSL握手失败的问题。

项目使用QT5.2.1开发,由于QT移植了开源的webkit,我们在项目中内置了一个浏览器,用来完成商品浏览和付款。

问题来了,当然需要进行“捉虫”了。

自从上次OpenSSL爆出“心脏出血”(见wiki),我们也使用了最新的openssl代码。

首先,需要定位问题出现的位置具体在哪里。

好在QT是开源的,方便我们定位问题,开启Debug模式,修改qtbase\src\network\network.pro文件:

修改

#DEFINES += QTCPSOCKETENGINE_DEBUG QTCPSOCKET_DEBUG QTCPSERVER_DEBUG QSSLSOCKET_DEBUG

DEFINES += QTCPSOCKETENGINE_DEBUG QTCPSOCKET_DEBUG QTCPSERVER_DEBUG QSSLSOCKET_DEBUG

然后使用qmake / namke,重新编译network模块,这样就可以查看Debug信息。

然后,我们从log里面看到下面的信息:

verification error: dumping bad certificate

"-----BEGIN CERTIFICATE-----

MIICPTCCAaYCEQDknv3zOugOz6URPhmkJAIyMA0GCSqGSIb3DQEBAgUAMF8xCzAJ

BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh

c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05

NjAxMjkwMDAwMDBaFw0wNDAxMDcyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD

VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMyBQdWJsaWMgUHJp

bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB

jQAwgYkCgYEAyVxZnvIbigEUtBDfBEDb41evakVAj4QMC9Ez2dkRz+4CWB8l9yqo

RAWq7AMfeH+ek7maAKojfdashaJjRcdyJ8z0TMZ1cdI5709C8HXfCpDGjiBvmA/4

rCNfcCk2pMmG57GaIMtTpYXnPb59mv4kRTPcdhXtD6JxZExlLoFoRacCAwEAATAN

BgkqhkiG9w0BAQIFAAOBgQBhcOwvP579K+ZoVCGwZ3kIDCCWMYoNer62Jt95LCJp

STbjl3diYaIy13pUITa6Ask05yXaRDWw0lyAXbOU+Pms7qRgdSoflUkjsUp89LNH

ciFbfperVKxi513srpvSybIk+4Kt6WcVS7qqpvCXoPawl1cAyAw8CaCCBLpB2veZ

pA==

-----END CERTIFICATE-----

"

...

Issuer: O= ("VeriSign, Inc.") CN= () L= () OU= ("Class 3 Public Primary Certification Authority") C= ("US") ST= ()

...

Valid: QDateTime("1996-01-29 00:00:00.000 UTC Qt::UTC") - QDateTime("2004-01-07 23:59:59.000 UTC Qt::UTC")

然来是系统中有一个证书过期了,导致SSL验证失败。

网上百度下,发现某些WIN 7(win 8) 确实有这个问题。而这些都是操作系统自带的证书,我们当然不能在客户的电脑上面随意删除这个证书,那么只能修改QT源代码了。

通过查找,最后定位在qtbase\src\network\ssl\qsslcontext.cpp文件的180行,有下面几行代码:

foreach (const QSslCertificate &caCertificate, expiredCerts) {
        q_X509_STORE_add_cert(sslContext->ctx->cert_store, reinterpret_cast<X509 *>(caCertificate.handle()));
    }

看代码,可以猜测到这里把一些过期证书添加到了SSL验证列表里面,那么,现在问题好解决,把上面的代码注释掉,从SSL验证列表里删除过期证书即可。

重新编译,调试,OK。

捉虫记:QT5.2 SSL握手失败问题

时间: 2024-08-03 07:21:37

捉虫记:QT5.2 SSL握手失败问题的相关文章

OkHttp还处理了代理服务器问题和SSL握手失败问题

Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClient,HttpURLConnection相对来说比HttpClient难用,google自从2.3版本之后一直推荐使用HttpURLConnection,并且在6.0版本的sdk中直接删掉了HttpClient类. 但是, 上面两个类库和OkHttp比起来就弱爆了, 因为OkHttp不仅具有高效的请求效率,并且节省宽带, 还提供了很多开箱即用的网络疑难杂症解决方案.(据说Android4.4的源码中可

Cocos2d-x 3.8.1+Cocos Studio 2.3.2捉虫记之控制场景文件中的骨骼动画

Cocos2d-x 3.8.1+Cocos Studio 2.3.2捉虫记之控制场景文件中的骨骼动画 引子 这段时间一直努力在把早期版本的拇指接龙游戏(Cocos2d-x 2.2.3+CocoStudio 1.4.0.1)升级到当前相对稳定的高大上环境--Cocos2d-x 3.8.1+Cocos Studio 2.3.2.行程中遇到不少麻烦,时间不知不觉像流水一样悄然逝去(这正是我时不时酸酸地想起"程序猿"三字的主要原因).想之再三,还是努力记录下来,一来为自己可能逝去的记忆,二来为

捉虫记(四)线程安全导致的HighCpu

一个朋友QQ群里说网站启动后会cpu很高,想要帮忙看一下dump. 1.打开windbg加载dump文件后第一个命令lmf,这个命令显示加载的dll以及路径,这样子可以找个dll来帮忙加载sos,(额,我记不住load那么长的路径啊) 0:000> lmf start end module name …… 00007ffb`a3750000 00007ffb`a375a000 version C:\Windows\System32\version.dll 00007ffb`a37e0000 00

MapReduce全局变量之捉虫记

Sublime 2 如何配置Java运行环境 第一步:配置JDK 之前玩过Java的都应该知道,在这里我就不赘述了. 第二步:创建runJava.bat 批处理文件 用记事本创建一个文件命名为runJava.bat 将下面的内容粘贴进记事本即可: @ECHO OFF cd %~dp1 ECHO Compiling %~nx1....... IF EXIST %~n1.class ( DEL %~n1.class ) javac -encoding utf-8 %~nx1 IF EXIST %~n

[原]捉虫记3:_ConectionPtr指针调用open失败

背景 产品使用MySQL来存储报警服务产生的报警.在报警服务的组件中使用ADO接口 客户方有两台计算机,一台计算机A用来组态,且可以对设备进行调试,操作系统是Win7 64bit 专业版,安装了VS2010:另一台计算机B用作验收后生产环境中使用,操作系统是Win 2008 R2 标准版 我个人在公司的工作机的操作环境是win10 64bit 企业版 问题 在客户公司时,组态.开发.调试都是在计算机A上进行的,运行也是在计算机A上.一切都很正常.当调试完后,就从现场回到杭州,可是后续又出现了一些

iOS 与 Java 服务器之间 SSL 握手失败的解决:Cipher Suites

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 先挖个坑,有机会填,没机会填也属正常,毕竟地球表面也布满了坑,只不过我们叫盆地或高山而已. Cipher Suites :加密套件?也许这么翻译也

寒假捉虫记——从一段损坏的调用栈开始折腾

放假在家,继续调试<家园>.目前的进度是MinGW上的编译链接都已通过,游戏程序也已经可以跑起来并进入主菜单界面,但加载关卡之后就会闪退.这让我想起了以前上中学时玩盗版游戏的日子.那个年代的单机游戏估计大多是用C/C++写的,一个不小心的内存操作就会让进程崩掉:而且那个年代的操作系统没现在稳定,可能破解技术也不够先进,从电脑城里买来的五六块钱的盗版游戏质量参差不齐.很多游戏跑着跑着就闪退,有的甚至连打都打不开,让人甚为恼火.如今源代码在手,并且我也是程序员了,可以对闪退的原因一探究竟,再也不用

捉虫记:SHGetSpecialFolderPath返回错误码为2

通常我们想获得系统的一些路径时,都会使用一些Shell函数.比如SHGetSpecialFolderPath,SHGetFolderPath,SHGetKnownFolderPath等,传入我们想要的路径的CSIDL即可.通常情况下都会得到我们想要的结果.但是也存在例外. 目前从事的工业监控软件的研发,一般的监控软件通常都是属于中大型的系统,还包括组态期和运行期,所以复杂度相对来说还是比较高的.上周测试团队报告了一个Bug,在运行期时,监控日志的保存按钮点击没反应.咋一看,就感觉好像是类似Fil

PHP网站 “新手”捉虫记

我拖着疲惫的身躯,努力打开眼皮在写...... 昨晚弄到12点,我感觉应该弄好了. 故事开头是这样的:我呢朋友有个网站需要开发,我当时没时间就包给外面的公司了,由于外面公司维护费用比较贵. 那么网站维护就交给我了,我呢做软件开发很多年了,没用过PHP,所以算是新手. 年前开始的某一天网站首页突然就被修改了,点链接都停在首页,且偶尔会打开菲律宾的博彩网站. 这下我开始紧张了,这网站访问量还比较大,不能出乱子啊. 1.爱理不理 那么我赶快请外包公司的帮我看看,可能是开发阶段结束了,没有给维护费用.