- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想设置 OpenSSL 库。对于我的 Qt 项目。在 Linux 下,它可以与内置的 OpenSSL 一起正常工作。我将其添加到我的 .pro 文件中:
LIBS+=-lcrypto
PKGCONFIG += openssl
但是如果我在 Android 中使用它,它会报错。我按照以下说明操作:
$ . ./setenv-android.sh
$ cd openssl-1.0.1h/
$ perl -pi -e 's/install: all install_docs install_sw/install: install_docs install_sw/g' Makefile.org
$ ./config shared -no-ssl2 -no-ssl3 -no-comp -no-hw -no-engine --openssldir=/usr/local/ssl/$ANDROID_API
$ make depend
$ ./Configure shared android-armv7
$ make build_libs
$ export CC=/home/laci/android-ndk-r10/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
$ export AR=/home/laci/android-ndk-r10/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar
$ export ANDROID_DEV=/home/laci/android-ndk-r10/platforms/android-14/arch-arm/usr/
$ make all
$ sudo -E make install CC=$ANDROID_TOOLCHAIN/arm-linux-androideabi-gcc RANLIB=$ANDROID_TOOLCHAIN/arm-linux-androideabi-ranlib
这些网站是我的来源:
我做错了什么?
预先感谢您的回答
最佳答案
解决方法是:
1a) 正确的方法:为 android 编译 openssl 库(使用 1.0.2+,不要使用 1.1.* - 至少对于 Qt 5.9.2)
或
1b) 快速而肮脏的方法:如果您需要快速而肮脏的解决方案,请从任何现有的应用程序 APK 中获取它们(警告:过时的库 ==> 安全威胁)。在 APK arm 目录中查找 libssl.so 和 libcrypto.so。
然后
2a) 打开 Qt Creator, Projects -> [project] -> Build & Run -> Android for armeabi->v7a -> Build -> Build Android APK -> Android -> Additional Libraries -> Add.. (add libssl.so,libcrypto.so)
或
2b) 在您的 .pro makefile 中,添加以下内容:
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
ANDROID_EXTRA_LIBS = \
$$PWD/android/libs/arm/libcrypto.so \
$$PWD/android/libs/arm/libssl.so
}
($$PWD/android/.. 是您放置这些库的项目中的路径)。对于这种情况,ANDROID_PACKAGE_SOURCE_DIR 看起来是可选的。
然后
3) 添加它们以加载到 AndroidManifest(至少对 Qt 5.9.2 有效):小心地将它们添加到您现有的主要 Activity 和进程外服务的元数据中(如果有的话)。
<meta-data android:name="android.app.load_local_libs" android:value="-- %%INSERT_LOCAL_LIBS%% --:lib/libssl.so:lib/libcrypto.so"/>
“lib”在这里必须是“lib”,它指的是设备上的目录布局,而不是您的项目结构。
然后
4) 构建您的 apk。验证您的库是否在正确的位置:
$ jar tvf ./android-build/build/outputs/apk/android-build-debug.apk| grep libssl
344388 Tue Apr 11 12:35:36 EEST 2017 lib/armeabi-v7a/libssl.so
我把这条指令放在这里,因为我花了太多时间寻找答案,没有 ANDROID_EXTRA_LIBS 的任何东西都不适合我。
注意
为什么这么麻烦?因为 6.0 及以下的机器人可能包含自己的 libssl/libcrypto 并且通过“-l”链接将在您的主二进制文件(不是 Qt 管理的)中添加自动加载条目,并且系统库可能版本错误,或者加载 SILENTLY INSTEAD OF您发布的二进制文件因此掩盖了 Android 7 的错误。Android 7 绝对不包含 libssl 并且“-l”将失败并且符号将不会在运行时解析。
通过不使用“-l”并使用 Qt 的“android.app.load_local_libs”,您强制 QtLoader 使用您的库版本。请记住,openssl 1.0.2 正在使用默认的 android Qt 构建,而 1.1.* 由于不同的符号而无法工作。 (SSL_init_library 是 1.0.2,OPENSSL_init_library 是 1.1.*)
有趣的是,由于这些复杂性,方法“1b)”可能行不通。您选择的 APK 可能包含 libssl.so,但其作者错误地构建并加载了它,因此他的 libssl.so 可能是不正确的 versioned shared library 这在 android 上通常是不允许的,但作者使用-l 并且从不加载自己的库(改为使用系统)并且从不知道他的库不会在 android 上加载。
关于android - QT + OpenSSL + 安卓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25147714/
如果我使用open ssl命令 sudo openssl genrsa -out privkey.pem 2048 要生成rsa key ,它仅生成1个文件。这是私钥。我如何获得公钥。 最佳答案 回答
三个不同版本的 openssl 正在同时更新 openssl.org : 0.98, 1.0.0, 1.0.1?它们之间有什么区别,我该如何选择要使用的版本? 最佳答案 https://en.wiki
我有以下命令用于 OpenSSL 生成私钥和公钥: openssl genrsa –aes-128-cbc –out priv.pem –passout pass:[privateKeyPass] 2
我正在尝试使用对应的 gcc (arm-none-eabi-5_4-2016q2) 为 cortex m3 机器交叉编译 openssl。机器应该有能力做 TCP 请求,我们希望在一天结束时做 HTT
我正在尝试使用 openssl dsa 实现,但我对以下细节感到非常困惑: 命令 openssl dsa .... 的选项“-text”:输出中的十六进制数字,我是否正确地假设这些是字节,因此它们是按
我正在尝试制作一个假 CA 并用它签署一个证书以与 stunnel 一起使用(这似乎只是调用 OpenSSL 例程,因此您可能不需要了解该程序来提供帮助:)。然而,stunnel 一直拒绝我的证书,说
不幸的是,Perl 在尝试安装 OpenSSL 的手册页(例如 OpenSSL_1_0_1g)时不知何故遇到了错误。因为我不需要它们 - 我只想使用 OpenSSL 作为 C 库,我想我可以通过完全跳
OpenSSL 中的 BIO 对到底是什么?它的用途是什么?我已经检查过 OpenSSL 文档,但任何细节都很少。 最佳答案 OpenSSL 中的 BIO 类似于文件句柄。您可以使用一对它们来安全地相
openssl ca 和 openssl x509 命令有什么区别?我正在使用它来创建和签署我的 root-ca、intermed-ca 和客户端证书,但是 openssl ca 命令不会在证书上注册
如何(如果有的话)为 OpenSSL 定义一个单一的可信证书文件在 Windows(Win-7,OpenSSL 1.0.1c)上使用 SSL_CERT_FILE 环境变量? 各种研究促使我下载了 Mo
我有一个自签名证书,其中显示了列出的基本约束,但从中生成的签名请求不显示这些属性,例如 [v3_req]。我怎样才能让它可见?我正在使用 openssl 生成证书。 场景: 我使用以下方法创建自签名证
这个问题在这里已经有了答案: Check if a connection is TLSv1 vs SSLv3 (SSL_CIPHER_description/SSL_CIPHER_get_name)
是否有更简单的方法来确定在构建 openssl 期间指定的选项,例如当时是否定义了 OPENSSL_NO_SRTP? 我只能从以下方面获得有限的信息: openssl 版本 -a 命令。但是,如果我只
我们正在与 AWS Nitro 合作,仅提供 3 小时的证书。 我们正在寻找一种可以跳过验证中的过期部分并仍然确认证书链有效的方法。 最佳答案 根据 openssl-verify 文档
嗨,我如何在 Easyphp 中启用 openssl,因为我收到错误消息无法发送。Mailer 错误:缺少扩展:opensslTime:使用 phpmailer 时。谢谢 最佳答案 在您的 php.i
我正在尝试以编程方式读取 OpenSSL 警报消息,但无法找到执行此操作的方法。 OpenSSL API 提供如下功能: const char *SSL_alert_type_string(int v
我跑了openssl speed在我的 Ubuntu 计算机上。一些结果: Doing md4 for 3s on 16 size blocks: 9063888 md4's in 3.00s Doi
我编译了带有cryptodev支持(即硬件加速)的OpenSSL,但不幸的是默认引擎仍然是软件。 time openssl speed -evp aes-128-cbc -engine cryptod
我需要从 RedHat Linux 服务器连接到 Microsoft Dynamics CRM 服务器。地址是xxx.api.crm4.dynamics.com。服务器接受 TLSv1 但不接受 1.
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 上个月关闭。 Improve thi
我是一名优秀的程序员,十分优秀!