Qt 6.2.1 WASM SSL [Megoldva]

Fórumok

Az esélytelenek teljes nyugalmával kérdezném, sikerült-e valakinek SSL-t hegesztenie Qt 6.2.1 alá úgy, hogy azzal SSL-képes WebAssembly applikációkat állítson elő?

EMSDK: 2.0.14
Qt: 6.2.1
SSL: 1.1.1k
 

Megoldás: a hiba az volt, hogy a configure-t meghívó scriptben whitespace hiba volt és ezért eldobta a config egy részét, beleértve az SSL beállításokat.

Hozzászólások

Érdekes kérdés, a Qt WebSocket wrapperen keresztül kommunikál (Emscripten), mihez kell az SSL lib?

Mintha a QSslError/QSslConfiguration -nak szüksége lenne rá. Qt5 alatt volt SSL forgatva (emmake) és az felszedte a Qt5.
Qt6-nál is le lett emscripten alá forgatva az openSSL, viszont a Qt6 configure mindig nyavajog,hogy nem találja. 
Azt ajánlja, hogy az OPENSSL_ROOT_DIR legyen beállítva, de beállítás után sem találja.

Az is lehet, hogy csak rutinból akarom ezt forgatni WASM alá is, így árnyékra vetődöm.

 

WebAssembly alatt nem tudsz közvetlenül natív SSL/TLS kommunikációt használni (jelenleg technológiai korlát). Viszont az OpenSSL lib más titkosításhoz/hitelesítéshez szükséges dolgot is tartalmaz. Ha ezek kellenek, akkor forgass bele, egyébként szedd ki a függőséget.

https://github.com/emqx/qmqtt/issues/191

Nincs elterelés és köszönöm az eddigi hozzászólásaidat is. Qt5 alatt minden rendben volt, volt alatta openssl.
Viszont Qt6 alatt a WASM kicsit visszalépett, hiszen hivatalosan is csak a 6.3-as verziótól lesz a WASM támogatva, a 6.2 eléggé "as-is".
Ezért kérdeztem, mivel pár - de nem sok - funkciót használunk az openSSL-ból, hogy sikerült valakinek szóra bírnia azt a 6.2 alatt vagy várni kell a 6.3-ig.

A configure egyébiránt működik és kompiláltam már vele, csak ugye SSL nélkül.

Abból tudok kiindulni amit eddig leírtál. Nem fordítási hibád van, nem is hibásan működik egy wasm bináris. Ez írtad: "a Qt6 configure mindig nyavajog,hogy nem találja", ez azt jelentheti, hogy ebben a verzióban talán ideiglenesen ki van iktatva az OpenSSL. Ha így van, akkor senkinek sem működik (valószínűleg okkal). Egyébként nálad van (a logokban szereplő) Qt konfigurációs hiba. De az első esetben is illik a naplóban jelezni mi a szitu. Emiatt írtam, hogy ez egy egyszerű konfigurációs dolog.

Az is lehetséges, hogy a 6.2 már nem OpenSSL forráskódot, hanem a header+wasm lib párost vár (a keresztfordítás miatt).

# When cross-compiling (to Android for example), we need to add the OPENSSL_ROOT_DIR as a root path,
# otherwise the value would just be appended to the sysroot, which is wrong.

https://github.com/qt/qtbase/blob/v6.2.1/cmake/FindWrapOpenSSLHeaders.c…

 

 

Azért még megnéztem a dev doksit is, régebben használtam Qt-t, a Qt6 eddig kimaradt. Konkrétan nem nevesítik az OpenSSL+Wasm esetet, de megerősítik amit az előbb írtam, nem tűnik webassembly specifikus hibának. Tehát megváltozott a módszer, nincs már "mindent az egyben" fordítás.

Cross-Compiling Qt

(...)

In Qt 5, configure allowed you to build the host tools as well as the target tools and libraries in one step. In Qt 6, this is no longer supported. Instead, you have to have Qt installed and running on the host before you can cross-compile Qt to the target. The installed Qt must furthermore be the same version as the one to be cross-compiled.

https://doc.qt.io/qt-6/qt6-buildsystem.html

Igen, ez megvan.
[1] A host Qt 6.2.1 szépen le lett forgatva és van benne SSL.
[2]Ezzel kezdtem el forgatni a cross compiled Qt verziót, ezzel létrehozva a WebAssembly-re forgatott Qt-t. 
[3] Az OpenSSL 1.1.1k is forrásból van forgatva linux-generic32 alá. 
[4] A sample program, ami nem tartalmaz SSL-t (QSslError meg preSharedKey) szépen le is fordul.

Viszont kellene bele az SSL libet berakni.
Ha jól gondolom, akkor a [2]-ben forgatott Qt alá kellene itt is behackelni (mint a Qt5-nél), egyébként az SSL feature nem lesz benne, ami miatt hiába adnám később ([4]) alatt oda a libssl-t, ott már mindegy lenne neki.

Ugye a Qt6 abban is különbözik a Qt5-től, hogy itt már cmake az alapértelmezett. Elvileg itt a [2]-nél történő fordításnál kell megadni az OPENSSL_ROOT_DIR-en keresztül, hogy hol van a cross compiled ssl verzió [3].
Viszont hiába van lekompilálva és ez helyesen kitöltve, mindig hibára fut.

A cmake hogyan bírható szóra, hogy kicsit verbose legyen, hogy az egyes modul teszteknél miért dobta el magát?

Egyáltalán maga a folyamat, amit fentebb vázoltam, reális? Vagy én néztem be valamit a dokumentációban?

A keresztfordítás miatt van keveredés. Az emscripten nem a rendszerkönyvtárból dolgozik, hanem saját sysroot könyvtárt használ. Talán shared könytárat készítesz static helyett.

[1] Host Qt 6.2.1 - ez ok

[2] OpenSSL emscripten static build (wasm lib) külön könyvtárba telepítve: pl. ~/OpenSSL_wasm/, linux-generic32 csak az emscripten miatt van, OS független wasm kód jön létre

[3] Qt emscripten build OPENSSL_ROOT_DIR=~/OpenSSL_wasm/ megadásával, ez nagyon fontos, mivel enélkül a Qt OpenSSL specifikus részei nem lesznek beforditval, nem elég csak összelinkelni

[4] A minta programot nem kell máshogy fordítani

A cmake --debug-find megadásával naplózza mit és hol keresett.

Itt egy minta script, pár dolgot át kell rajta írni (linux-generic32, prefix=, +install):

https://gist.github.com/ip6li/b01022c49ad10deb9aa21dda45dddc78

Igen, itt akadtam el. A [2]-ben létrehozom az emscriptenes libssl.a-t, ami egy külön könyvtárba kerül.
A [3]-nál megadom a [2]-beli könyvtárat export OPENSSL_ROOT_DIR=/path/-al. (Amit egyébként mond is, hogy felvett a keresési utak közé)
S nem eszi meg ...

Tehát elvileg mindent jól csinálok, csak nem látom a fától az erdőt. 
Átnézem a scriptet, lehet hogy csak egy "/" hiányzik valahonnan. 

Nem véletlenül linkeltem be az egyik Qt cmake config fájlt. Ha figyelmesen megnézed, minden verzió ugyanolyan módon keresi a szükséges fájlokat.

létrehozom az emscriptenes libssl.a-t, ami egy külön könyvtárba kerül.

Ez mit jelent? Telepíted ahogy írtam, és a /path/lib/libssl.a és /path/include/*.h fájlok szépen létrejönnek?

Megvolt: whitespace hiba volt a scriptben, ezért több konfig beállítást, közöttük az SSL-ét nem vette át.