赞
踩
本文旨在提供一个Android libcurl 国密库的编译流程和使用详解
国密算法(SM2/SM3/SM4)是中国国家密码管理局颁布的密码算法标准,用于安全通信、数字签名等领域,本文将使用libcurl库,因为它是一个广泛使用的,支持多种协议的网络传输库,所以需要将libcurl库与国密算法结合使用以实现国密通信~
ok,let’s go~
本文作者环境:
Windows版本: Windows 10
Android NDK版本:r21或更高版本
确保已安装 Android NDK,设置好ANDROID_NDK_HOME环境变量(此处不再赘述,基本功哈...)
git clone https://github.com/guanzhi/GmSSL.git
首先进入gmssl文件夹中, 然后创建 ‘build-android’文件夹, 创建该文件夹的目的在于创建编译输出文件,最后执行
./setenv-android.sh
然后运行以下命令
make clean
make
make install
ok~ 至此gmssl的编译就算完成;
git clone https://github.com/curl/curl.git
进入libcurl源码目录,创建编译输出文件夹,执行以下命令
cd curl
mkdir build-android
cd build-android
创建build.sh脚本文件,并将以下内容复制到文件中
#!/bin/bash export ANDROID_NDK_HOME=你的Android_NDK路径 export GmSSL_INSTALL_DIR=你的GmSSL安装目录 API_LEVEL=21 ANDROID_ABI="armeabi-v7a with NEON" ARCH=arm PLATFORM=android TOOLCHAIN=${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64 export PATH=${TOOLCHAIN}/bin:$PATH export CC=${TOOLCHAIN}/bin/armv7a-linux-androideabi${API_LEVEL}-clang export CXX=${TOOLCHAIN}/bin/armv7a-linux-androideabi${API_LEVEL}-clang++ export AR=${TOOLCHAIN}/bin/arm-linux-androideabi-ar export LD=${TOOLCHAIN}/bin/arm-linux-androideabi-ld export RANLIB=${TOOLCHAIN}/bin/arm-linux-androideabi-ranlib ../configure --host=arm-linux-androideabi \ --enable-static --disable-shared \ --disable-debug --disable-verbose \ --disable-curldebug \ --enable-http --disable-ftp --disable-file --disable-ldap --disable-ldaps --disable-rtsp --disable-proxy --disable-dict --disable-telnet --disable-tftp --disable-pop3 --disable-imap --disable-smb --disable-smtp --disable-gopher --disable-manual \ --disable-sspi --disable-ntlm-wb --disable-tls-srp \ --disable-crypto-auth --disable-ntlm --disable-cookies \ --with-ssl=$GmSSL_INSTALL_DIR \ --without-zlib \ --without-ca-bundle --without-ca-path \ --prefix=$(pwd)/../output/android make make install
最后,赋予脚本可执行权限,并执行~
chmod +x build.sh
./build.sh
此时,编译后的libcurl将位于output/android目录下~
1.将编译好的libcurl库与GmSSL库添加到Android项目中:
将GmSSL库的include文件夹复制到Android项目的jni目录下
将编译好的libcurl库(libcurl.a)和GmSSL库(libcrypto.a、libssl.a)复制到Android项目的jni/libs目录下
2.创建Android.mk文件:
在jni目录下创建一个名为Android.mk的文件,将以下内容复制到文件中:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := gmssl LOCAL_SRC_FILES := libs/libcrypto.a include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := ssl LOCAL_SRC_FILES := libs/libssl.a include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := curl LOCAL_SRC_FILES := libs/libcurl.a include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := my_native_module LOCAL_SRC_FILES := my_native_module.c LOCAL_STATIC_LIBRARIES := curl ssl gmssl LOCAL_LDLIBS := -llog include $(BUILD_SHARED_LIBRARY)
3.编写本地代码:
在my_native_module.c文件中,可以使用libcurl库和GmSSL库进行国密通信。例如,使用HTTPS GET请求:
#include <jni.h> #include <string.h> #include <curl/curl.h> JNIEXPORT jstring JNICALL Java_com_example_myapp_MainActivity_sendHttpsRequest(JNIEnv *env, jobject instance) { CURL *curl; CURLcode res; curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/"); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L); res = curl_easy_perform(curl); if (res != CURLE_OK) { return (*env)->NewStringUTF(env, curl_easy_strerror(res)); } curl_easy_cleanup(curl); } curl_global_cleanup(); return (*env)->NewStringUTF(env, "Request completed successfully."); }
4.在Android项目中调用本地方法:
在MainActivity.java中调用本地方法,如下所示
public class MainActivity extends AppCompatActivity { static { System.loadLibrary("my_native_module"); } public native String sendHttpsRequest(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String result = sendHttpsRequest(); Log.i("MainActivity", result); } }
至此,您已成功编译Android libcurl 国密库,并在Android项目中使用它进行国密通信~
若还有问题随时评论联系我~
我一共划分了六个阶段,但并不是说你得学完全部才能上手工作,对于一些初级岗位,学到第三四个阶段就足矣~
这里我整合并且整理成了一份【282G】的网络安全从零基础入门到进阶资料包,需要的小伙伴可以扫描下方CSDN官方合作二维码免费领取哦,无偿分享!!!
如果你对网络安全入门感兴趣,那么你需要的话可以
点击这里
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。