Qt之SSL问题

简述

传输层安全性协议(英语:Transport Layer Security,缩写:TLS)及其前身安全套接层(英语:Secure Sockets Layer,缩写: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.dlllibssl-1_1.dll两个文件拷贝到工程的可执行文件目录下,或者是Qt编译器所在目录下(只要能被链接到就可以)。

Qt自2019就结束对OpenSSL1.0.x的支持了,新版本将使用1.1.x。版本变更不是重点,重点是那两个库的名字从以前的libeay32.dllssleay32.dll变成了libcrypto-1_1.dlllibssl-1_1.dll,网上很多解决办法都是使用旧版本的库,这是不行的。没准你在看到这篇文章的时候,库名字又变了。作为一个白嫖怪,对开源软件版本的把控能力还是要有的。

思考

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

扩展阅读

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

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

维基百科SSH

维基百科TLS

公开密钥加密

你可能感兴趣的:(Qt基础)