操作步骤
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 版本众多---需要仔细找到对应的版本进行修改才行