Qt5.7 实现Https 认证全过程解析(亲自动手版)

jk-Huan 2018-05-11 原文

Qt5.7 实现Https 认证全过程解析(亲自动手版)

#### NetworkRequestManager.h

#include <QSsl>
#include <QSslKey>
#include <QSslSocket>
#include <QSslConfiguration>
#include <QSslCertificate>
#include <QSslError>
#include <QUrl>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QtNetwork>

class NetworkRequestManager : public QObject
{
Q_OBJECT
public:
explicit NetworkRequestManager(QObject *parent = 0);
void sendMsg(const QString& ,const QString&, const QString&);
void sendMsgWithoutToken(const QString&, const QString&);

private:
QSslConfiguration m_sslconf;
QNetworkRequest m_request;
QNetworkAccessManager *m_manager;

signals:
void PostRequestFinished(const QJsonObject&);

private slots:
void RequestFinished(QNetworkReply*);
void sslErrorsH(QNetworkReply*, QList<QSslError>);
};

#endif // NETWORKREQUESTMANAGER_H

 

** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** 

** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** 

1. pc-client.crt 

2. pc-client.key

3. pc-server.pem

 这3个秘钥文件都是用服务器生成的,在本机用p12文件生成,不知什么原因无法认证成功,也许是因为不会用 openssl ,求大神全解。。

 关于Https的认证过程,自行百度吧。。 QNetwork 类还是封装的不错的,都是以异步处理的,而且可以配合Json字符串的解析。。

** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** 

** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** 

 

#### NetworkRequestManager.cpp

NetworkRequestManager::NetworkRequestManager(QObject *parent) : QObject(parent)
{
// Https ca certificate ..
// 创建客户端证书
QFile t_file(“:/https/license/pc-client.crt”);
t_file.open(QIODevice::ReadOnly);
const QSslCertificate certificate(&t_file, QSsl::Pem);
t_file.close();

// 创建客户端私钥
t_file.setFileName(“:/https/license/pc-client.key”);
t_file.open(QIODevice::ReadOnly);
const QSslKey prvateKey(&t_file, QSsl::Rsa);
t_file.close();

// SSL验证模式;TLS协议版本
m_sslconf.setPeerVerifyMode(QSslSocket::VerifyPeer);
m_sslconf.setProtocol(QSsl::TlsV1_2OrLater);
m_sslconf.setLocalCertificate(certificate);
m_sslconf.setPrivateKey(prvateKey);

// 创建服务器端证书
QList<QSslCertificate> caCerList;
t_file.setFileName(“:/https/license/pc-server.pem”);
t_file.open(QIODevice::ReadOnly);
const QSslCertificate cACertificate(&t_file, QSsl::Pem);
// 将服务证书加入到CA列表中
caCerList.append(cACertificate);
m_sslconf.setCaCertificates(caCerList);
t_file.close();

this->m_manager = new QNetworkAccessManager;
m_request.setSslConfiguration(m_sslconf);
QObject::connect(m_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(RequestFinished(QNetworkReply*)));
QObject::connect(m_manager, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)), this, SLOT(sslErrorsH(QNetworkReply*,QList<QSslError>)));
}

void NetworkRequestManager::sslErrorsH(QNetworkReply *reply, QList<QSslError> error)
{
qDebug() <<“** sslErrorsH ..” <<error;
}

void NetworkRequestManager::RequestFinished(QNetworkReply *reply)
{
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
QVariant statusCodeV =
reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);

QJsonDocument jdoc = QJsonDocument::fromJson(reply->readAll().constData());
QJsonObject obj = jdoc.object();

qDebug() <<“** RequestFinished” <<reply->isFinished() <<statusCode;

if(!obj.isEmpty()) emit this->PostRequestFinished(obj);
reply->deleteLater();
}

 

发表于 2018-05-11 16:47 jk-Huan 阅读() 评论() 编辑 收藏

 

版权声明:本文为jk-Huan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/jk-Huan/p/9025484.html

Qt5.7 实现Https 认证全过程解析(亲自动手版)的更多相关文章

随机推荐

  1. linux下载神器

    本文链接自:https://blog.csdn.net/qq378947986/article/details […]...

  2. SQL server 2005版本及安装问题

    sql2005 SQL2005 分五个版本,如下所列,  1.Enterprise(企业版),       2 […]...

  3. Web API系列(二) Filter的使用以及执行顺序

    在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截 […]...

  4. 一种快速UWB 测距方法(单周期法) — 代码实现

    在之前的分析过一种快速测距方法原理:https://www.cnblogs.com/tuzhuke/p/123 […]...

  5. 手机端白屏前端优化的方法,5 种以上

    手机端白屏前端优化的方法,5 种以上 手机白屏主要是因为页面渲染阻塞导致的,导致的原因有: 1:css文件加载 […]...

  6. 离京总结-写于离京前夕 – 只会一点java

    一、引子 作为一个资深北漂,博主从16年就开始思考退路。17年筛选了全国几乎所有经济强市,最终选定了广州。后续 […]...

  7. Huawei配置两台交换机堆叠示例

    配置两台交换机堆叠示例(先配置后连线方式,推荐) 一、基本概念 在堆叠中,有以下一些基本概念,如图1所示。图1 […]...

  8. Spring Boot (七)MyBatis代码自动生成和辅助插件

    一、简介 1.1 MyBatis Generator介绍 MyBatis Generator 是MyBatis […]...

展开目录

目录导航