c++ - 当我尝试加载 cer 文件时 QSslCertificate 崩溃

标签 c++ qt openssl certificate

我在Qt中有这段代码

QFile file(address);
file.open(QIODevice::ReadOnly);
const QByteArray bytes = file.readAll();

qDebug()<<"Length : " + QString::number(bytes.length());

const QSslCertificate cert(bytes,QSsl::Der);

当我在 windows 7 64 位中尝试这段代码时,它运行得很好,但是当我为 linux 编译它时,它每次遇到最后一行时都会崩溃,即使它给了我正确的长度,但它在终端中与这些行一起崩溃。

qt.network.ssl: QSslSocket: cannot resolve TLSv1_1_client_method
qt.network.ssl: QSslSocket: cannot resolve TLSv1_2_client_method
qt.network.ssl: QSslSocket: cannot resolve TLSv1_1_server_method
qt.network.ssl: QSslSocket: cannot resolve TLSv1_2_server_method
qt.network.ssl: QSslSocket: cannot resolve SSL_select_next_proto
qt.network.ssl: QSslSocket: cannot resolve SSL_CTX_set_next_proto_select_cb
qt.network.ssl: QSslSocket: cannot resolve SSL_get0_next_proto_negotiated
qt.network.ssl: QSslSocket: cannot resolve EC_KEY_new_by_curve_name
qt.network.ssl: QSslSocket: cannot resolve EC_KEY_free
Segmentation fault (core dumped)

这是怎么回事我没有在我的代码中使用任何 QSslSocket,我已经被这个问题困了好几天了。
qt 版本 5.4.2 在 Ubuntu 13.10 64bit 和 CentOS 6.4 64bit 上测试

更新
我在 Windows 和 Linux 上都使用了 openssl-1.0.2d。

最佳答案

我找到了解决方案,我所做的是:

OpenSSL 1.1.0 与 QT 不兼容,所以我克隆了 1.0.1 稳定版: 这是错误:https://bugreports.qt.io/browse/QTBUG-52905

git clone https://github.com/openssl/openssl -b OpenSSL_1_0_1-stable

然后将其安装到自定义位置:

./config --prefix=/opt/openssl-stable
make
make test
sudo make install

获取 QT 源代码,然后当您想要构建它们时,您必须链接已安装的 OpenSSL:

OPENSSL_LIBS='-L/opt/ssl/lib -lssl -lcrypto' ./configure -openssl-linked

参见:http://doc.qt.io/qt-5/ssl.html

这是我的配置:

OPENSSL_LIBS='-L/opt/openssl-stable/lib -lssl -lcrypto' ./configure -prefix /opt/qt5.7_linux_staticssl -opensource -confirm-license -release -openssl-linked -I /opt/openssl-stable/include/openssl -L /opt/openssl-stable/lib

如果 qt 构建给你一个错误,它没有找到一些 ssl 结构,只需将/opt/openssl-stable/include/openssl header 复制到/usr/include/openssl 或 qt 正在寻找它们的任何地方(当qt build失败的时候可以看到)

就这样

关于c++ - 当我尝试加载 cer 文件时 QSslCertificate 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32584284/

相关文章:

javascript - 列表元素和 JavaScript 值

google-chrome - 主题备用名称丢失 & ERR_SSL_VERSION_OR_CIPHER_MISMATCH

paypal - 是否有任何免费的 GUI 工具可以为 PayPal 加密网站支付生成证书?

c++ - 局部/全局 bool 问题

C++ 结构和 "expected primary-expression"错误

c++ - 如何使 QGraphicsTextItem 单行?

c++ - 如何在C++中将JWK公钥转换为PEM格式

C++ : Restrict method access in derived class

Linux DRM ( DRI ) 无法像以前一样使用 FBDEV 屏蔽 Scrape/dev/fb0

c++ - 如何使用 Qt 禁用 Windows 中的键(全局)?