嵌入式QT应用程序与WEB端通信遇到的HTTPS校验证书的问题记录

简介: 嵌入式QT应用程序与WEB端通信遇到的HTTPS校验证书的问题记录

1、问题背景描述

近期在做嵌入式QT应用程序与物联网平台交互。其实这个需求我在以往的工作中也做过,只不过这次的情况有些特殊。当我使用QNetworkAccessManager向平台分别发起POSTGET请求时,打印错误如下:

640.png

这个问题在PC端并没有出现,而是在嵌入式平台瑞芯微RV1109上出现了。

2、解决方案

参考了stackoverflow.com上网友给出的解决方案:

640.png

意思是说忽略所谓的SSL验证模式,这样的话问题就能够解决了。那么PC端为什么不会出现这个问题呢?是因为PC端之前就安装了云平台部门给的证书,因此PC端即使不加上面那几行代码也是可以正常运行的。而开发板不能校验通过的原因是因为开发板上没有权威的根证书,因此导致校验云平台的证书没有通过。


什么是SSL ?


SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层与应用层之间对网络连接进行加密。


有关QTSSL证书认证的三种方式:

(1)忽略校验证书
QSslConfiguration config ;
config.setPeerVerifyMode(QSslSocket::VerifyNone);
config.setProtocol(QSsl::TlsV1);
QNetworkRequest request(req);
request.setSslConfiguration(config);
(2)否允许在请求中使用HTTP管道

640.png

QNetworkRequest request ;
request.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true);
QNetworkReply* reply = QNetworkAccessManager::createRequest(op, request, outgoingData);
reply->ignoreSslErrors();
(3)手动加载证书
QSslConfiguration config ;
QList<QSslCertificate> certs = QSslCertificate::fromPath("C:\\FiddlerRoot.crt");
config.setCaCertificates(certs);
QNetworkRequest request(req);
request.setSslConfiguration(config);

如果平台有强制要求必须认证证书的话,那么推荐第三种,手动将证书进行加载操作。


对开始请求的接口代码进行修改:

void network_manage::startRequest(QUrl url)
{
    QFileInfo info(url.path());
    QString fileName(info.fileName());  //获取文件名
    if(fileName.isEmpty())
    {
        fileName = "index.html";
    }
    download_file = new QFile(fileName);
    if(!download_file->open(QIODevice::WriteOnly))
    {
        qDebug()<<"file open error";
        delete download_file;
        download_file = 0;
        return ;
    }
    /*添加对QSsl的配置处理*/
    QSslConfiguration config = m_netGetRequestHead.sslConfiguration();
    config.setPeerVerifyMode(QSslSocket::VerifyNone);
    config.setProtocol(QSsl::TlsV1SslV3);
    m_netGetRequestHead.setSslConfiguration(config);
    m_netGetRequestHead.setUrl(QUrl(url));
    /*添加对QSsl的配置处理*/
    /*进行GET请求,进行文件下载*/
    download_reply = download_manager.get(m_netGetRequestHead);
    connect((QObject *)download_reply, SIGNAL(finished()),this, SLOT(DownLoad_FiLe_Finished()));
    connect((QObject *)download_reply, SIGNAL(readyRead()),this, SLOT(DownLoad_File_ReadyRead()));
    connect((QObject *)download_reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(updateDown_Load_File_Progress(qint64,qint64)));
}

接下来在嵌入式平台上,能够看到正常发起的POST和GET请求:

640.png

显示效果如下:

640.png

参考文献与引用

(N.d.). Retrieved from https://baike.baidu.com/item/ssl
(N.d.). Retrieved from https://doc.qt.io/archives/qt-4.8/qnetworkrequest.html
(N.d.). Retrieved from https://stackoverflow.com/questions/38379848/qnetworkaccessmanager-reset-tcp-connection
(N.d.). Retrieved from https://blog.csdn.net/itjobtxq/article/details/8244509

往期精彩

瑞芯微RV1109 SDK编译&支持QT程序开发


如何添加APP到Buildroot里(以瑞芯微rv1126为例)


新产品立项了,作为嵌入式软件工程师该如何来开展设计工作?(个人经验分享)


手把手之如何在嵌入式Linux上运行QT应用程序(以百问网imx6ull开发板为例)


目录
相关文章
|
21天前
|
前端开发 JavaScript 关系型数据库
从前端到后端:构建现代化Web应用的技术探索
在当今互联网时代,Web应用的开发已成为了各行各业不可或缺的一部分。从前端到后端,这篇文章将带你深入探索如何构建现代化的Web应用。我们将介绍多种技术,包括前端开发、后端开发以及各种编程语言(如Java、Python、C、PHP、Go)和数据库,帮助你了解如何利用这些技术构建出高效、安全和可扩展的Web应用。
|
29天前
【QT】读写.ini配置文件的程序实现
【QT】读写.ini配置文件的程序实现
|
2月前
|
监控 Serverless 测试技术
Serverless 应用引擎常见问题之做的web服务计费如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
408 3
|
3天前
|
开发框架 缓存 前端开发
利用Visual Basic构建高效的ASP.NET Web应用
【4月更文挑战第27天】本文探讨使用Visual Basic与ASP.NET创建高效Web应用的策略,包括了解两者基础、项目规划、MVC架构、数据访问与缓存、代码优化、异步编程、安全性、测试及部署维护。通过这些步骤,开发者能构建出快速、可靠且安全的Web应用,适应不断进步的技术环境。
|
5天前
|
开发框架 自然语言处理 Linux
Qt:构建强大跨平台应用程序的框架
Qt:构建强大跨平台应用程序的框架
|
4天前
|
前端开发 JavaScript Go
构建高性能Web应用:优化前端资源加载
在构建现代Web应用时,优化前端资源加载是至关重要的一步。本文将介绍一些提升Web应用性能的关键策略,包括减少HTTP请求、压缩和合并资源、使用CDN加速、以及异步加载技术等。通过实施这些优化策略,开发人员可以显著提升网站的加载速度和用户体验。
|
5天前
|
存储 中间件 Go
探索Gin框架:快速构建高性能的Golang Web应用
探索Gin框架:快速构建高性能的Golang Web应用
|
5天前
|
前端开发 JavaScript Java
前端与后端:构建现代Web应用的双翼
前端与后端:构建现代Web应用的双翼
|
5天前
|
安全 前端开发 JavaScript
在Python Web开发过程中:Web框架相关,如何在Web应用中防止CSRF攻击?
在Python Web开发中防范CSRF攻击的关键措施包括:验证HTTP Referer字段、使用CSRF token、自定义HTTP头验证、利用Web框架的防护机制(如Django的`{% csrf_token %}`)、Ajax请求时添加token、设置安全会话cookie及教育用户提高安全意识。定期进行安全审计和测试以应对新威胁。组合运用这些方法能有效提升应用安全性。
13 0
|
12天前
|
SQL 安全 Go
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
在Python Web开发中,确保应用安全至关重要,主要防范SQL注入、XSS和CSRF攻击。措施包括:使用参数化查询或ORM防止SQL注入;过滤与转义用户输入抵御XSS;添加CSRF令牌抵挡CSRF;启用HTTPS保障数据传输安全;实现强身份验证和授权系统;智能处理错误信息;定期更新及审计以修复漏洞;严格输入验证;并培训开发者提升安全意识。持续关注和改进是保证安全的关键。
20 0

推荐镜像

更多