【发布时间】:2017-07-15 12:35:17
【问题描述】:
我正在为 Android 开发一个基于 Qt 的应用程序,它使用 QSslSocket 下载数据。由于自 Marshmallow Qt 程序依赖 OpenSSL 库以来 Android 从 OpenSSL 迁移到 BoringSSL,因此在 Android 6+ 上会产生以下警告:
W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法解析 CRYPTO_free W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法解析 EVP_CipherFinal W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法解析 EVP_rc2_cbc W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法解析 SSLv2_client_method W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法解析 SSLv2_server_method W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法解析 OPENSSL_add_all_algorithms_noconf W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法解析 OPENSSL_add_all_algorithms_conf W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法解析 EC_get_builtin_curves W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法调用未解析的函数 OPENSSL_add_all_algorithms_conf W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法调用未解析的函数 EC_get_builtin_curves W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法调用未解析的函数 EC_get_builtin_curves W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: 无法设置 SSL_CTRL_SET_TLSEXT_HOSTNAME,服务器名称指示已禁用 W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法调用未解析的函数 CRYPTO_free但是,套接字本身成功连接到远程主机并从那里读取数据,没有任何明显的问题。这让我想知道是否需要自己构建 OpenSSL 库并将其打包,还是使用平台提供的 BoringSSL 就可以了。
我还注意到,Android 版本低于 6 的应用倾向于使用 OpenSSL 的系统版本,即使我提供了自己的版本。我尝试使用ANDROID_EXTRA_LIBS 添加构建的libssl.so 和libcrypto.so(从libssl.so.1.0.0 和libcrypto.so.1.0.0 重命名)(不确定是否也需要使用LIBS+=)甚至静态链接 libssl.a 和 libcrypto.a。仍然 QSslSocket::sslLibraryVersionString() 返回平台上可用的版本。
我的问题是:
- 是否需要自己构建OpenSSL库并打包或者使用平台提供的库?
- 如果我这样做了,如何让 Android 识别 libssl.so 和 libcrypto.so?
【问题讨论】:
-
你有什么问题?
-
首先需要自己搭建OpenSSL库并打包好还是使用平台提供的库好?如果我这样做了,如何让 Android 识别 libssl.so 和 libcrypto.so?
-
您应该构建它们并随应用程序一起发布。较旧的 Android 使用与 1.0 不兼容的 openssl 0.9。不幸的是,android 并不那么容易,即使你发布了 openssl,它也会尝试先启动平台一。我现在有同样的问题,我认为唯一的解决办法是使用静态链接的 openssl 构建自己的 QT。
标签: android qt ssl openssl boringssl