qt程序,从一个http网页上下载,返回301,得到重定向网址,是个https网址,再次qt下载。
同一个程序,在pc上的ubuntu5.13.2,编译后,最后可以下载到文件。
交叉编译到arm板上执行,http get没问题,可以得到正确的重定向网址,再get就直接触发QNetworkReply的finished信号了,没有读取到数据。
arm板上是qt5.6,也有libssl库,而且,通过Qsslsocket::suportsssl()函数,返回的也是true,说明qt能调用ssl库。
但,问题在哪里呢?
在线
今天又试了下,qt get https:www.baidu.com
PC上编译后确实可以收到数据。
交叉编译后arm板上,仍是直接触发finished信号,没读到任何数据。
看样子是arm板上的qt,https有问题,http正常。但不知道问题在哪里。
在线
是不是板子里没放证书?Qt里可以尝试下忽略SSL错误
离线
是不是板子里没放证书?Qt里可以尝试下忽略SSL错误
板子里搜*cert*相关,搜到这:
/etc/ssl/certs
是个目录,不过是空的...
----------------------------------
qDebug() << QNetworkReply->errorString() << endl;
得到:
"SSL handshake failed"
最近编辑记录 Gentlepig (2023-02-20 14:20:32)
在线
之前的代码没有设置QSslConfigruation相关,又搜了个例程加上去,貌似能连上了,虽然最后不知道为何又多了个“Unkonwn error"
14 void httpStart(const QUrl &requestedUrl)
13 {
12 this->url = requestedUrl;
11 QNetworkRequest request(this->url);
10 QSslConfiguration config; //该行之前没有;
9 config.setPeerVerifyMode(QSslSocket::VerifyNone); //该行之前没有;
8 config.setProtocol(QSsl::TlsV1_0); //该行之前没有;
7 request.setSslConfiguration(config); //该行之前没有;
6 this->reply = qnam.get(request);
5 // this->reply = qnam.get(QNetworkRequest(this->ur↷
4
3 connect(this->reply, &QNetworkReply::finished, th↷
2 connect(this->reply, &QIODevice::readyRead, this,↷
1 connect(this->reply, &QNetworkReply::downloadProg↷
243 }
:/mnt# ./qmqtt_example
true "OpenSSL 1.0.2j 26 Sep 2016" "OpenSSL 1.0.2j 26 Sep 2016"
("ftp", "file", "qrc", "http", "https", "data")
""
http ready to read.
"<html>\r\n<head>\r\n\t<script>\r\n\t\tlocation.replace(location.href.replace(\"https://\",\"http://\"));\r\n\t</script>\r\n</head>\r\n<body>\r\n\t<noscript><meta http-equiv=\"refresh\" content=\"0;url=http://www.baidu.com/\"></noscript>\r\n</body>\r\n</html>"
227 227
227 227
http finished.
("Accept-Ranges", "Cache-Control", "Connection", "Content-Length", "Content-Type", "Date", "P3p", "Pragma", "Server", "Set-Cookie", "Strict-Transport-Security", "Traceid", "X-Frame-Options", "X-Ua-Compatible")
""
"Unknown error"
^C
最近编辑记录 Gentlepig (2023-02-20 16:16:26)
在线
试试 this->reply->ignoreSslErrors(),新加上的 ssl 配置不需要。另外也可以从 pc 机上复制那些证书过去
离线
再记录下,之前在ubunt18.04上跑这个程序,https下载正常。复制到ubunt22.04后,有提示ssl:
qt.network.ssl:QSslSocket: cannot resolve EVP_PKEY_base_id
qt.netwrok.ssl:QSslSocket: cannot resolve SSL_get_peer_certificate
查看sll版本,发现ubuntu22.04用的是openssl3.0.2,qt5.13.2构建用的是openssl1.1.1b。
下载了openssl1.1.1,解压后,设为动态库编译,make后得到的libcrypto和libssl,复制到qt目录下的/gcc_64/lib目录下,再运行程序就不报错了。
在线