Qt之SSL问题

  • Post author:
  • Post category:其他




简述


传输层安全性协议

(英语:

T

ransport

L

ayer

S

ecurity,缩写:

TLS

)及其前身

安全套接层

(英语:

S

ecure

S

ockets

L

ayer,缩写:

SSL

)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。

网景

公司(Netscape)在1994年推出首版

网页浏览器



网景导航者

时,推出

HTTPS

协议,以SSL进行加密,这是SSL的起源。在浏览器、电子邮件、即时通信、网络传真等应用程序中,广泛支持这个协议。主要的网站,如Google、Facebook等也以这个协议来创建安全连线,发送数据。当前已成为互联网上保密通信的工业标准。

SSL有多种实现,其中OpenSSL是其开源实现。

今天在使用QNetworkAccessManager进行Post时,发现了如下错误

QSslSocket::connectToHostEncrypted: TLS initialization failed

错误提示TLS初始化失败,经过一番了解,原来是本地主机确少SSL功能,需要安装。

但是安装完成之后仍然报错,经过进一步探究,原来是SSL版本与当前使用的Qt所支持的SSL版本不一致。版本弄完之后,问题解决。



具体解决步骤



查看当前Qt对OpenSSL的支持情况

qDebug() << QSslSocket::supportsSsl();

返回

true

则表示系统支持OpenSSL,返回false表示系统不支持OpenSSL。



查看Qt所支持的OpenSSL版本

OpenSSL在版本兼容性问题上是出了名的,所以必须要搞清楚自己所用Qt版本所支持的OpenSSL版本。用如下代码进行OpenSSL版本查看:

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



下载对应版本的OpenSSL

根据自己操作系统种类以及位数,下载对应的OpenSSL版本,下载地址如下:


OpenSSL下载地址



拷贝文件

安装完成后,将OpenSSL安装目录下的bin文件夹中的

libcrypto-1_1.dll



libssl-1_1.dll

两个文件拷贝到工程的可执行文件目录下,或者是Qt编译器所在目录下(只要能被链接到就可以)。

Qt自2019就结束对OpenSSL1.0.x的支持了,新版本将使用1.1.x。版本变更不是重点,重点是那两个库的名字从以前的

libeay32.dll



ssleay32.dll

变成了

libcrypto-1_1.dll



libssl-1_1.dll

,网上很多解决办法都是使用旧版本的库,这是不行的。没准你在看到这篇文章的时候,库名字又变了。作为一个白嫖怪,对开源软件版本的把控能力还是要有的。



思考

搞个OpenSSL要进行那么多操作,是不是觉得太麻烦了,为什么Qt不像浏览器那样直接集成OpenSSL功能,而非要我们另行安装呢?为什么非要把OpenSSL的库另外拿出来包含在工程文件里呢?。关于前者,网上的一种说法是出于软件安全的考虑,至于到底是怎样的安全,不太清楚。至于后者,Qt源码中写道,使用OpenSSL所需要的库文件,被认为是开发文件的一部分,也就是和我们写的源码文件是一个地位。



扩展阅读

SSL中涉及到一个概念:非对称加密。在SSH中也有到这个概念。下面提供几篇扩展阅读来增进了解


图解SSH原理及两种登录方法


维基百科SSH


维基百科TLS


公开密钥加密



版权声明:本文为YinShiJiaW原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。