QT适配OpenSSL库的保姆级教程

操作步骤

1.查看自己的QT支持的OpenSSL版本号

1.1查看版本号
1.新建项目:OpenSSLDemo[采用MinGw32]进行编译

2.在pro文件中加入QT += network

3.在头文件中加入#include <QDebug> #include <QSslSocket>

4.qDebug()<<QSslSocket::sslLibraryBuildVersionString();

通过上述步骤:得出支持的OpenSSL版本-----》本人采用的QT版本为:QT5.14.2 

1.2查看自己的QT版本是否配置了OpenSSL 
添加头文件 #include <QNetworkAccessManager>
//看看是否配置了ssl
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
qDebug() << manager->supportedSchemes();

通过上述步骤:得出结论未安装OpenSSL

2 安装OPenSSL 

        安装Open SSL的方式有两种:

        1.下载已经编译好的库,放到指定位置

        2.自己编译源码

2.1下载已经编号好的库
网址:
https://slproweb.com/products/Win32OpenSSL.html

在上述网址中找到对应的OPenSSL版本;我的版本是“OpenSSL 1.1.1d 10 Sep 2019”  见官网找到的截图如下:

一个是OpenSSL库,一个是安装库的必备软件,后面有说明【两个都安装吧】

注意值得提醒的是:

此处有Win32和Win64可选,这里的位数指的是你调用OpenSSL开发出来的软件的位数版本,而不是你计算机的位数。
开发32位软件选择Win32,64位选择Win64,如果同时需要开发32位和64位的则下载两个



比较好的参考网址:
https://blog.csdn.net/zhizhengguan/article/details/112848095
安装过程省略了,直接下一步即可。
有个小插曲----》我把32和64位的都进行了安装。然后再次运行程序以后发现

"OpenSSL 1.1.1d  10 Sep 2019"
("ftp", "file", "qrc", "http", "https", "data")
输出当前QT支持的openSSL版本:  "OpenSSL 1.1.1d  10 Sep 2019"
OpenSSL支持情况:  true
OpenSSL运行时SSL库版本:  "OpenSSL 1.1.1d  10 Sep 2019"

多出来了https 和支持情况为 true 


但是 在网上寻到代码进行 具体功能验证的时候 会报一些奇奇怪怪的错误。一些明明.h文件里有的函数但是不能被找到使用,未定义。

在此呢 先做一个暂定 后续 配置完成在继续教程

2.2代码进行自我编译:先略过

        个人认为没必要,根据QT适配的版本进行下载即可【有闲暇时余再更此段】

3.针对OpenSSL的一些小知识积累

        1.关于名字的变化
在1.0.x之前的版本中,文件为libeay32.dll和ssleay32.dll,在1.1.x之后的版本中,名字是libssl.dll和libcrypto.dll
        2.针对于前面造成的问题趟坑后的解决方式

按照上面的安装OpenSSL 方式.然后将需要的 *.lib 和include文件夹 复制到工程文件夹下面然后在.pro文件里面添加

INCLUDEPATH += $$PWD/include
LIBS += -L$$PWD/lib/MinGW -llibcrypto
LIBS += -L$$PWD/lib/MinGW -llibssl

上述的操作LIBS 的路径不正确 找到的两个库不对

INCLUDEPATH += $$PWD/include
LIBS += -L$$PWD/lib/ -llibcrypto
LIBS += -L$$PWD/lib/ -llibssl

为了防止有文件被遗忘:建议规范操作-----》将安装路径下的所有文件全部拷贝到工程文件当中

然后规定只能在pro 里面添加 以下几句话

LIBS += -L$$PWD/OpenSSL_Win32/lib/ -llibssl
LIBS += -L$$PWD/OpenSSL_Win32/lib/ -llibcrypto

INCLUDEPATH += $$PWD/OpenSSL_Win32/include
DEPENDPATH += $$PWD/OpenSSL_Win32/include

 测试成功的代码如下:

QT -= gui

CONFIG += c++11 console
CONFIG -= app_bundle


DEFINES += QT_DEPRECATED_WARNINGS

#INCLUDEPATH += D:\OpenSSL\SSL_32\OpenSSL-Win32\include

#LIBS    += D:\OpenSSL\SSL_32\OpenSSL-Win32\lib\libssl.lib \
#           D:\OpenSSL\SSL_32\OpenSSL-Win32\lib\libcrypto.lib



SOURCES += \
        applink.c \# 第二个例子需要
        main.cpp

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

LIBS += -L$$PWD/OpenSSL-Win32/lib/ -llibssl


LIBS += -L$$PWD/OpenSSL-Win32/lib/ -llibcrypto


INCLUDEPATH += $$PWD/OpenSSL-Win32/include
DEPENDPATH += $$PWD/OpenSSL-Win32/include





==================================================================================




#include <QCoreApplication>
#include <openssl/ssl.h>
#include <QDebug>

std::string sha256(const std::string str)
{
    char buf[2];
    unsigned char hash[SHA256_DIGEST_LENGTH];
    SHA256_CTX sha256;
    SHA256_Init(&sha256);
    SHA256_Update(&sha256, str.c_str(), str.size());
    SHA256_Final(hash, &sha256);
    std::string newString = "";
    for(int i = 0; i < SHA256_DIGEST_LENGTH; i++)
    {
        sprintf(buf,"%02x",hash[i]);
        newString = newString + buf;
    }
    return newString;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    std::string str = "Hello World";
    qDebug() << QString::fromStdString(sha256(str));

//第二个例子
    RSA *rsa = RSA_new();
    SSL_library_init();
    OpenSSL_add_ssl_algorithms();
    SSLeay_add_ssl_algorithms();
    // 生成 RSA 密钥对,这里的 2048 是密钥位数
    BIGNUM *e = BN_new();
    BN_set_word(e, RSA_F4); // RSA_F4 是通常的公钥指数值
    RSA_generate_key_ex(rsa, 2048, e, nullptr);
    
    // 导出公钥到文件
    FILE *pubKeyFile = fopen("public_key.pem", "wb");
    PEM_write_RSAPublicKey(pubKeyFile, rsa);
    
    // 导出私钥到文件(通常需要密码保护)
    FILE *privKeyFile = fopen("private_key.pem", "wb");
    PEM_write_RSAPrivateKey(privKeyFile, rsa, nullptr, nullptr, 0, nullptr, nullptr);
    
    // 释放资源
    RSA_free(rsa);
    BN_free(e);
    fclose(pubKeyFile);
    fclose(privKeyFile);
    
    qDebug()<<"RSA密钥对生成成功!" <<endl;

    return a.exec();
}


在第二个例子中 会报错 【OPENSSL_Uplink(59129348,08): no OPENSSL_Applink 】

需要将lib文件夹的applink.c 添加到工程文件夹中
参考:【https://blog.csdn.net/u010058695/article/details/122980941】

 特别感谢C/C++编程:openssl使用(win10+qt + qmake)_qt把openssl放到c编译-CSDN博客

OpeSSL 版本众多---需要仔细找到对应的版本进行修改才行

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gallagher_SF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值