Qt发起Http/Https请求

1. BurpSuite抓包

1.1 设置代理

burpsuite代理设置

浏览器代理设置(chrome),其他浏览器同理。

地址栏输入 chrome://settings/,

打开代理设置

设置代理端口

如果使用了代理插件,比如switchomega,可以这么设置

这样当选择使用代理选项的时候,请求包的数据也会被burpsuite拦截到。

1.2 导入证书

浏览器地址栏输入 http://burp/,如果有使用代理插件,建议先停用插件,待正确导入证书后开启使用,后续不再有影响。

点击CA Certificate,下载证书cacert.der

浏览器地址栏输入chrome://settings/

选择 “受信任的根证书颁发机构”,导入证书

下一步,选择证书,导入成功。

1.3 拦截抓包

浏览器地址栏输入地址访问,www.baidu.com

intercept is off 拦截已关闭

intercept is on 拦截已开启

可以看到请求包已经被我们拦截下来了。

选择放行Forward或者点击Intercept is on关闭拦截就会把数据包放行出去。

HTTP history中可以观察到已经拦截到的请求地址

如果有过滤的需求,可点击过滤

点击链接,会显示请求和响应等数据

下面自我发挥……

Qt发起http/https请求

1. 配置openssl

qt自身是不支持https的,如果想要使用https发起请求,要进行相关配置。

1.1 查看qt支持哪些协议

可以通过以下代码查看使用的qt版本支持哪些协议。

pro文件设置

添加network支持,QT += network

查看qt支持哪些协议

#include <QNetworkAccessManager>

#include <QDebug>



QNetworkAccessManager *manager = new QNetworkAccessManager(this);

qDebug() << manager->supportedSchemes();

2 配置ssl
2.1 下载openssl
http://slproweb.com/products/Win32OpenSSL.html
选择版本,就选择这个版本了
2.2 下载后直接安装,然后加入到系统环境变量(我的安装目录是D:\OpenSSL-Win32\bin)
2.3 配置qt支持https


LIBS += -L"D:/OpenSSL-Win32/lib" -llibeay32 
LIBS += -L"D:/OpenSSL-Win32/lib" -lssleay32
INCLUDEPATH += $$quote(D:/OpenSSL-Win32/include)
可以测试ssl是否配置成功或者查看ssl的错误提示。
#include <QSslSocket>
qDebug() <<"ssl:" << QSslSocket::sslLibraryBuildVersionString();
2.4 编写程序
这里不必要的业务逻辑就不在写了,主要放上https请求的代码,着重关注和http请求的不同点。

bool MainWindow::SendHttp()

{
    /*QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    qDebug() << manager->supportedSchemes();*/

    qDebug() <<"ssl:" << QSslSocket::sslLibraryBuildVersionString();

    QNetworkRequest request;
    QSslConfiguration config;

    QNetworkProxy proxy;
    proxy.setType(QNetworkProxy::HttpProxy);
    proxy.setHostName("127.0.0.1");
    proxy.setPort(8080);
    QNetworkProxy::setApplicationProxy(proxy);

	//url
	request.setUrl(QUrl(strWww));

    QSslConfiguration conf = request.sslConfiguration();
    config.setPeerVerifyMode(QSslSocket::VerifyNone);
    config.setProtocol(QSsl::TlsV1_0);
    request.setSslConfiguration(config);

    //header
    auto it = m_headerMap.begin();
    while(it != m_headerMap.end())
    {
        //qDebug() << it->second.m_skey.toLatin1() << it->second.m_sval.toLatin1() << ‘\n‘;
        request.setRawHeader(it->second.m_skey.toLatin1(), it->second.m_sval.toLatin1());
        ++it;
    }

    //nam
    QNetworkAccessManager qnam;
	qDebug() << qnam.supportedSchemes();

    // 开启一个局部的事件循环,等待响应结束,退出
    QEventLoop loop;
    QTimer timer;
    //发出请求
    QNetworkReply *reply = qnam.get(request);
    QObject::connect(&qnam,SIGNAL(finished(QNetworkReply *)),&loop,SLOT(quit()));
    //请求结束并下载完成后,退出子事件循环
    QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    //超时退出
    QObject::connect(&timer,SIGNAL(timeout()),&loop,SLOT(quit()));
    //超时设置5秒钟
    timer.start(5000);
    //开启子事件循环
    loop.exec();
    //....

    if (reply->error() == QNetworkReply::NoError)
    {
        QVariant statusCodeV =
            reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);

       if(statusCodeV.toInt() == 200
                                    /*这里写了这个readAll(),
                                     * 下面readAll()就取不出数据了
                                     * && !reply->readAll().isEmpty()
                                     */
        )
        {

           //写入文件
           std::ofstream ofile;
           ofile.open("test.txt");
           if(ofile.fail())
           {
                qDebug() << "error ofile" << ‘\n‘;
           }
           //reply->readAll().isEmpty()
           ofile << reply->readAll().toStdString();
           ofile.flush();
           ofile.close();
        }
    }

	return true;
}


原文地址:https://www.cnblogs.com/HackerArt/p/10502478.html

时间: 2024-11-05 12:19:38

Qt发起Http/Https请求的相关文章

用curl发起https请求

使用curl发起https请求 使用curl如果想发起的https请求正常的话有2种做法: 方法一.设定为不验证证书和host. 在执行curl_exec()之前.设置option $ch = curl_init(); ...... curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 方法二.设定一个正确的证书. 本地ssl判别证书太旧,导致链接报错ssl

用curl获取https请求

今天一个同事反映,使用curl发起https请求的时候报错:"SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed" 很明显,验证证书的时候出现了问题. 使用curl如果想发起的https请求正常的话有2种做法: 方法一.设定为不验证证书和host.

Qt 之 使用 https发送 HTTP请求(使用OPENSSL库)

一.简述 在使用Qt发送HTTP请求中一般使用的链接都是http://前缀,而有的服务器支持 https://前缀的链接,而Qt本身是支持https的,但是https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在Qt中使用https需要进行SSL认证.实现非常容易,简单几步即可完成. 二.HTTPS和HTTP的区别 1.简介 超文本传输协议HTTP被用于在Web浏览器和网站服务器之间传递信息.HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网

发起https请求并获取结果

/**     * 发起https请求并获取结果     *      * @param requestUrl     *            请求地址     * @param requestMethod     *            请求方式     * @param outputStr     *            请求数据     * @return     * @throws Exception     */    public static String MsgHttpsR

nodejs发起HTTPS请求并获取数据

var https = require('https'); var zlib = require('zlib'); var post_data="………………";//请求数据 var reqdata = JSON.stringify(post_data); var options = { hostname: '10.225.***.***', port: '8443', path: '/data/table/list', method: 'POST', rejectUnauthoriz

java如何发起https请求

1.写一个SSLClient类,继承至HttpClient import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import org.apache.http

使用CURL检测Clinet侧发起的HTTP请求各阶段时间

前言 上周,我方的一个客户反馈,访问我们的接口,平均耗时在2s以上.但是我方对请求进入,和请求返回,整个过程都有监控,我方的耗时基本在50ms以内,非常快. 后来了解到,客户从广东访问到我方上海,公网来访问我方.那么就建议去检测,DNS耗时,TCP建立的耗时等.理论上,长距离的公网,网络延迟就非常高.遂建议使用CURL去检查.结果果然如猜想,在TCP建立的耗时就很久. 进入正题,这篇文章主要介绍使用CURL检测Client端发起的HTTP请求,各个阶段的时间. 第一.HTTP请求的过程介绍 一个

禁止将http请求强制转换为https请求

近期遇到一个问题,在谷歌浏览器里发起的http请求都会被转化为https请求,但在safari里面不会被转化,所以暂时只能用Safari浏览器进行调试,后来还查看了为什么http被强制转化为https请求,但是在网上找的解决方法都不对,后来发现是一个meta标签的问题,代码是:<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">,只要把这段代码去掉,

封装HttpClient进行http请求与https请求

一.https忽略证书 /** * 用于进行Https请求的HttpClient * * @author joey * */ public class SSLClient { public static CloseableHttpClient createSSLClientDefault(){ try { SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { //