QT适配OpenSSL库的保姆级教程
openssl
传输层安全性/安全套接层及其加密库
项目地址:https://gitcode.com/gh_mirrors/ope/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 版本众多---需要仔细找到对应的版本进行修改才行
GitHub 加速计划 / ope / openssl
20
1
下载
传输层安全性/安全套接层及其加密库
最近提交(Master分支:3 个月前 )
5b94140b
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
Reviewed-by: Paul Dale <ppzgs1@gmail.com>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/26462)
3 天前
1dafff06
When a requested parameter has a non-NULL result pointer,
and the error isn't simply that the result buffer is too
small, don't return a non-zero result size.
Returning a non-zero result size that isn't larger than the
user's provided space is an indication that a result of
that size was actually written, inviting trouble if the
error indication was inadvertenly lost.
Also, in such cases (wrong type, data can't be converted to the
requested type when otherwise supported, ...) there is nothing useful to
be done with the return size value, it can't help to address the
problem.
Reviewed-by: Tim Hudson <tjh@openssl.org>
Reviewed-by: Paul Dale <ppzgs1@gmail.com>
(Merged from https://github.com/openssl/openssl/pull/26436)
3 天前
更多推荐
已为社区贡献1条内容
所有评论(0)