openssl移植Android使用及其相关经验分享


1.      linux安装openssl库

参见《精通PKI网络安全认证技术与编程实现》2.3.2节 Linux下搭建OpenSSL开发环境

Linux下面解压tar.bz2文件:tar jxvf  android-ndk-r5c-linux-x86.tar.bz2

 

2.      配置NDK的环境变量

在~/.bashrc文件末尾添加:
NDK=~/android-ndk-r4b
export NDK

 

执行source ~/.bashrc

如果有终端已经运行,需要在重启终端才能使用NDK变量

3.      JNI介绍

JNI主要功能就是能够调用到C库,在这里我们需要用C或C++调用openssl库实现加密签名等功能,然后编译成arm体系的so库,用java调用提供的接口。


详细介绍参见此书:《TheJava Native Interface: Programmer’s Guide and Specification

4.      下载android版本的openssl,编译

现在网上我看见过3种版本的android-openssl,fries版本,eighthave版本以及guardianproject版本,前面两个版本有测试过但是没有尝试成功,guardianproject版本编译成静态库再给android的JNI动态库程序调用的话会找不到方法,不清楚是什么原因,但是直接将JNI程序与openssl工程一起编译就可以实现。

下面这个blog有说编译openssl静态库给android用,但是不知道他用的是什么版本的Openssl,我按照他的方法尝试没有成功。

### 如何在Android平台上移植和集成OpenSSL #### 下载并准备环境 为了成功地将 OpenSSL 移植Android 平台,首先需要准备好开发环境。这包括安装 Android NDK 和获取 OpenSSL 源代码。 可以从 GitHub 上找到适用于 AndroidOpenSSL 版本[^1]: ```bash git clone https://github.com/guardianproject/openssl-android.git ``` 对于特定版本的 OpenSSL 编译指南可以参考专门针对 Android 的编译说明文档[^2]。这里提供了一个用于设置 Android 构建环境的 Shell 脚本 `Setenv-android.sh` ,该脚本可以帮助配置交叉编译所需的环境变量。 #### 配置构建工具链 接着要确保正确设置了 NDK 路径以便能够调用相应的编译器和其他工具链组件。例如,在 Windows 系统中可以通过 Cygwin 来模拟 Unix-like 环境来进行编译工作,并指定 NDK 安装路径作为环境变量的一部分[^4]: ```bash export NDK_PATH=/cygdrive/D/Progra~1/Android/android-ndk-r6b ``` 注意这里的路径应当根据实际安装位置做相应调整。 #### 开始编译过程 完成上述准备工作之后就可以着手于 OpenSSL 的编译了。通常情况下会有一个自动化的过程来处理大部分细节问题;然而有时也需要手动干预以解决可能出现的问题或自定义某些选项。具体操作可参照已有案例中的描述[^3],其中提到的一般流程如下所示: 1. 获取最新版 OpenSSL 源码包; 2. 使用提供的 shell script 或者按照官方指导修改 Makefile 文件适应目标平台特性; 3. 执行 make 命令启动整个项目的编译直至生成所需的目标文件(通常是 .a 后缀名表示静态链接库)。 #### 将 OpenSSL 整合进项目 一旦拥有了经过验证可用性的预编译二进制形式的 OpenSSL 库,则可以在应用程序里通过 JNI 接口访问这些功能。如果是在 C/C++ 层面上直接利用的话就更加简单——只需把头文件加入 include path 中并将对应的 lib 加入 linker link list 即可实现基本的功能支持。 ```cpp #include <openssl/sha.h> // ... other includes ... unsigned char hash[SHA_DIGEST_LENGTH]; SHA_CTX sha; SHA_Init(&sha); SHA_Update(&sha, data_to_hash, strlen(data_to_hash)); SHA_Final(hash, &sha); for (int i = 0; i < SHA_DIGEST_LENGTH; ++i) { printf("%02x", hash[i]); } printf("\n"); ``` 以上是一个简单的例子展示了如何使用 OpenSSL 提供的安全散列算法接口计算字符串的消息摘要值。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值