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、运行及抓包分析

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

相关推荐
_林枭_12 小时前
ZW3D二次开发_原生表单_如何设置表单左上角图标
qt·zw3d
Lsetea18 小时前
Nginx报SSL_CTX_use_PrivateKey failed:证书与私钥不匹配怎么排查
nginx·https·ssl证书·openssl·私钥
Quz18 小时前
QML 快捷键篇:基础快捷键与组合键序列
qt·qml
qq_2976708719 小时前
第 4 篇:HTTP 和浏览器——HTTPS 不只是「把 HTTP 包一层 TLS」那么简单
网络安全·https·tls
今夕资源网20 小时前
本地SSL证书生成工具本地 HTTPS 配置不用再敲命令:CertTool 一站式管理自签证书与 Hosts
网络协议·https·ssl·ssl证书生成·ssl本地测试证书
≮傷£≯√21 小时前
Qt 面试(一)
qt·ffmpeg·音视频
西西弗Sisyphus1 天前
Qt 分类导航区的实现
开发语言·qt
galaxy_strive1 天前
Qt C++插件化编写项目(1)
开发语言·c++·qt
ocean21031 天前
2025-2026年计算机网络面试高频知识点洞察
计算机网络·面试·职场和发展·https·tcp·面试真题·秋招春招
今夕资源网1 天前
Windows 本地 HTTPS 配置教程:使用 CertTool 创建自签名证书并部署到宝塔
windows·网络协议·https