QT充当客户端模拟浏览器等第三方客户端对https进行双向验证

ssl单向证书和双向证书校验测试及搭建流程 文章中,已经做了基于https的单向认证和双向认证,,,
在进行双向认证时,采用的是curl工具或浏览器充当客户端去验证。
此次采用QT提供的接口去开发客户端向服务器发送请求,来验证https的双向认证流程。

1、准备

依然以 ssl单向证书和双向证书校验测试及搭建流程 该文章作为前提条件进行开发。

开发环境:
客户端:Win10-64 + Qt5.13-MingW.32
服务端:Linux + openssl-1.1.1.f + nginx/1.18.0

2、分析

实际上在上文所指向的文章中,我们通过curl命令行来作为客户端向服务器发起了基于https的双向认证。见下图。

在这里指定了客户端私钥和客户端的证书。。。
再次回顾用浏览器充当客户端去进行https的双向认证,在那里我们事先导入了客户端的p12证书,p12证书实际上是客户端crt证书和客户端私钥key的结合体。

综上所述,两种方法中有一个共性,就是发送时都需要客户端的证书和私钥。。
双向校验时,肯定是要携带客户端的证书给服务器的。。。。
那么自然的,在QT中也要按照此套路开发(发送请求时携带证书与私钥),,,QT也提供了相应的接口。

2、核心代码

c 复制代码
void MainWindow::testSsl()
{
    // 加载客户端证书
    QFile crtFile("C:\\Users\\XingWei\\Documents\\untitled42\\client.crt");
    crtFile.open(QIODevice::ReadOnly);
    QSslCertificate certificate(&crtFile, QSsl::Pem);
    crtFile.close();

    // 加载客户端私钥
    QByteArray passPhrase("123456");  // 私钥的密码
    QFile keyFile("C:\\Users\\XingWei\\Documents\\untitled42\\client.key");
    keyFile.open(QIODevice::ReadOnly);
    QSslKey privateKey(&keyFile, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey, passPhrase);
    keyFile.close();

    // ssl配置
    QSslConfiguration conf;
    conf.setPeerVerifyMode(QSslSocket::QueryPeer);
    conf.setProtocol(QSsl::TlsV1SslV3);
    conf.setPrivateKey(privateKey);
    conf.setLocalCertificate(certificate);
    
    QNetworkRequest request;
    request.setUrl(QUrl("https://50.50.1.118"));
    request.setSslConfiguration(conf);

    QEventLoop loop;
    QNetworkReply* reply = m_manager.get(request);
    connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
    connect(reply, &QNetworkReply::finished, this, [=] {

        qDebug() << "####################### get data finished...";

        QByteArray data = reply->readAll();
        qDebug() << data;
    });
    loop.exec();

    qDebug() << "#############> " << reply->errorString() << reply->error();
}

3、运行及抓包分析

通过抓包,可以明显的看出,客户端和服务器各自向彼此发送了各自的证书。。
同时,服务器也正常响应客户端了。。

相关推荐
Mark Studio2 小时前
QT linux 静态编译问题记录
开发语言·qt
挠到秃头的涛某3 小时前
华为防火墙web配置SSL-在外人员访问内网资源
运维·网络·网络协议·tcp/ip·华为·ssl·防火墙
Pluchon6 小时前
硅基计划6.0 陆 JavaEE Http&Https协议
网络协议·tcp/ip·http·网络安全·https·udp·java-ee
2501_915909066 小时前
深入理解HTTPS和HTTP的区别、工作原理及安全重要性
安全·http·ios·小程序·https·uni-app·iphone
jf加菲猫6 小时前
第1章 认识Qt
开发语言·c++·qt·ui
普普通通的南瓜7 小时前
网站提示 “不安全”?免费 SSL 证书一键解决
网络·数据库·网络协议·算法·安全·iphone·ssl
上线就吃代码7 小时前
【等保测评】数据库数据库配置have_ssl参数为yes
服务器·数据库·ssl
xiaoxiongip66619 小时前
假设两个设备在不同网段,网关怎么设置才能通呢
网络·爬虫·python·https·智能路由器
墨香幽梦客19 小时前
HTTPS/SSL证书全生命周期管理:从申请到续期的运维要点
运维·https·ssl
q***235719 小时前
使用 Nginx 搭建代理服务器(正向代理 HTTPS 网站)指南
运维·nginx·https