#### 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();
}

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

  1. .NET Core中的认证管理解析

    .NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...

  2. AFNetworking之于https认证

    写在开头: 本来这篇内容准备写在AFNetworking到底做了什么?(三)中的,但是因为我想在三中完结这个系列,碍于篇幅所限.并且这一块内容独立性比较强,所以单独拎出来,写成一篇. 本文从源码的角度 ...

  3. Tomcat双向Https验证搭建,亲自实现与主流浏览器、Android/iOS移动客户端超安全通信

    紧接着<Tomcat单向Https验证搭建,亲自实现与主流浏览器.Android/iOS移动客户端安全通信>,此处演示下更安全的双向Https认证的通信机制,为了清晰明了,以下进行单独描述 ...

  4. Tomcat单向Https验证搭建,亲自实现与主流浏览器、Android/iOS移动客户端安全通信

    众所周知,iOS9已经开始在联网方面默认强制使用Https替换原来的Http请求了,虽然Http和Https各有各的优势,但是总得来说,到了现在这个安全的信息时代,开发者已经离不开Https了. 网上 ...

  5. AFNetworking 之于 https 认证

    写在开头: 本来这篇内容准备写在AFNetworking到底做了什么?(三)中的,但是因为我想在三中完结这个系列,碍于篇幅所限.并且这一块内容独立性比较强,所以单独拎出来,写成一篇. 本文从源码的角度 ...

  6. 【转】AFNetworking之于https认证

    转自:http://www.cocoachina.com/ios/20161220/18393.html 写在开头: 本来这篇内容准备写在AFNetworking到底做了什么?(三)中的,但是因为我想 ...

  7. Linux下Apache https认证

    参考:http://kyfxbl.iteye.com/blog/1910891 http://showerlee.blog.51cto.com/2047005/1266712 一.环境 httpd:A ...

  8. https认证

    HTTPS认证 说明 1. HTTPS协议的站点信息更加安全,同时可降低网站被劫持的风险,如网站同时存在HTTP和HTTPS站点,可使用本工具进行认证,便于百度搜索识别网站HTTP与HTTPS之间的对 ...

  9. Harbor配置https认证

    Harbor配置https认证由于Harbor不附带任何证书,它默认使用HTTP来提供注册表请求.但是,强烈建议为任何生产环境启用安全性.因为测试使用,使用自签名证书: 1.创建CA证书 首先创建个目 ...

随机推荐

  1. java线程池ThreadPoolExecutor 如何与 AsyncTask() 组合使用

    简单说下Executors类,提供的一系列创建线程池的方法: 他们都有两个构造方法 1. --------newFixedThreadPool (创建一个定长线程池,可控制线程最大并发数,超出的线程会 ...

  2. 控件的基本使用-iOS—UI笔记

    学习目标 1.[掌握]第一个UI项目 2.[掌握]控件连线 3.[掌握]按钮的基本操作 4.[掌握]控件的常用属性 一.第一个UI项目 UI (User Interface)也是就用户界面,是App的 ...

  3. ARM v7汇编与相关练习

    程序入口: _startc 语言入口: main@:              注释;main:           标签;伪指令:         给汇编器读的指令;.global main    ...

  4. 说说nio----1

    既然说到了nio,就得谈以下几个问题 为什么会出现新io,"旧io"有什么问题吗? ok,一步一步来,先给大家看几个例子: 1单线程的服务器程序 import java.net.* ...

  5. 【一天一道LeetCode】#32. Longest Valid Parentheses

    一天一道LeetCode系列 (一)题目 Given a string containing just the characters '(' and ')', find the length of t ...

  6. Linux 打开句柄限制的调整

    Linux 打开句柄限制的调整 参考文章: Linux---进程句柄限制总结(http://blog.csdn.net/jhcsdb/article/details/32338953) !! 本文内容 ...

  7. Android中代码运行指定的Apk

    有时候,当我们编写自己的应用的时候,需要通过代码实现指定的apk,安装指定的主题,或者安装新的apk.可以通过以下方法实现: private void installAPK(String apkUrl ...

  8. jsp中的tag与tld

    转载自: http://www.cnblogs.com/fanzi2009/archive/2010/04/08/1707888.html 在jsp文件中,可以引用tag和tld文件.  1.对于ta ...

  9. 数据cube的schema与sql的对应的关系

    用schema workbench 设置cube的维度结构 saiku 使用的cube,会将不同维度的查询转化为sql语句. schema中, cube的事实表和dimension表进行自然连接,具体 ...

  10. 网站开发进阶(十六)错误提示:Multiple annotations found at this line:- basePath cannot be resolved to a variable

    错误提示:Multiple annotations found at this line: basePath cannot be resolved to a variable 出现以上错误,主要是由下 ...