OpenSSL
是一個強大的開源安全套接字層密碼庫,它包含了主要的密碼學算法,經常使用的密鑰和證書封裝管理以及SSL協議,並提供豐富的應用程序供測試或其餘目的使用。
在Android
上開發對於安全的需求愈來愈高,雖然OpenSSL
出現過幾回漏洞,但它仍然是在安全方面的使用最多的加密庫之一。OpenSSL
是一個基於c語言開發的,古老的,開源的加密庫,想要在Android
上使用OpenSSL
必需要藉助NDK
,先使用NDK編譯成Android上面的動態鏈接庫(或者靜態連接庫),再借助JNI層的封裝,提供給Java層調用。
這篇文章主要寫的是如何編譯Android
的OpenSSL
類庫。參考OpenSSL的官方文檔:wiki.openssl.org/index.php/A…javascript
環境準備:php
OpenSSL
能夠在github上找到源代碼,源代碼地址:github.com/openssl/ope…java
git clone git@github.com:openssl/openssl.gitlinux
也能夠在官網上下載最新的release版本:www.openssl.org/source/
因爲OpenSSL
項目的主幹(master)上提交的是開發分支,最好把OpenSSL
切換到最新的release版本上面android
git checkout OpenSSL_1_1_0egit
Setenv-android.sh
是用來編譯Android上的OpenSSL的腳本,下載地址:wiki.openssl.org/images/7/70…github
給Setenv-android.sh
腳本能夠運行的權限安全
chmod a+x Setenv-android.shapp
安裝makedepend
brew install makedepend
Setenv-android.sh
腳本的做用是用來給編譯OpenSSL配置Android編譯的環境變量的。腳本下載完成以後是不能直接運行,緣由在於腳本里面的變量並無配置,須要配置變量:
ANDROID_NDK_ROOT:
ANDROID_ARCH: arch-arm
ANDROID_EABI: arm-linux-androideabi-4.9
ANDROID_API: android-23
ANDROID_SYSROOT: /platforms/android-23/arch-arm
ANDROID_TOOLCHAIN:
FIPS_SIG:
CROSS_COMPILE: arm-linux-androideabi-
ANDROID_DEV: /platforms/android-23/arch-arm/usr複製代碼
已經設置了Android NDK
和Android SDK
變量的,只須要把正確的值配置到腳本就能夠了,設置腳本中的變量:
ANDROID_NDK_ROOT=$NDK_HOME
_ANDROID_API="android-23"
_ANDROID_EABI="arm-linux-androideabi-4.9"複製代碼
運行腳本:
./Setenv-android.sh
沒有Error
出現就表示配置正確了。
上面的配置已經給OpenSSl的編譯環境設置了環境變量例如:
export MACHINE=armv7
export RELEASE=2.6.37
export SYSTEM=android
export ARCH=arm複製代碼
根據上面的設置的環境變量,再運行./config
就能夠實現編譯Android上OpenSSL的配置,make就能夠開始編譯了。
由於在Android設備上面運行,建議不要編譯完整的OpenSSL庫,官方給的建議編譯Android的選項:
shared,no-ssl2,no-ssl3,no-comp,no-hw,no-engine
編輯OpenSSl
的類庫能夠安裝到本地,這樣能夠像使用NDK中其餘庫同樣的使用OpenSSL,編譯命令能夠設置--openssldir
用來指定OpenSSL的安裝目錄。
cd openssl-1.0.1t
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
運行到這裏的時候獲得一個這樣的信息:
perating system: i686-apple-darwinDarwin Kernel Version 15.5.0: Tue Apr 19 18:36:36 PDT 2016; root:xnu-3248.50.21~8/RELEASE_X86_64
WARNING! If you wish to build 64-bit library, then you have to
invoke './Configure darwin64-x86_64-cc' *manually*.
You have about 5 seconds to press Ctrl-C to abort.複製代碼
編譯的OpenSSL
使用的是本地的darwin64-x86_64-cc
,並非想要的arm-linux-androideabi-gcc
編譯的,編譯的這個類庫是不能在Android上面使用的。緣由是什麼呢?查看了下環境變量:
echo $ANDROID_API
發現這個變量沒有配置,上面的環境變量的配置Setenv-android.sh
在設置的環境變量並無起做用。
在Setenv-android.sh
中,嘗試下打印$ANROID_API
的值,打印$ANDROID_API
的內容:
echo "ANDROID_API:
echo $ANDROID_API
"
獲得結果爲:
...
ANDROID_API: android-23
...複製代碼
能夠看到$ANDROID_API
變量在Setenv-android.sh
的生命週期內是有效的,而腳本運行結束以後設置的變量沒有設置成功這個應該是由於我使用了fish
有關,所以我就考慮把編譯的命令都放在Setenv-adnroid.sh
裏,在Setenv-android.sh
的生命週期內運行完全部的編譯命令。
從新建一個腳本名字爲build-android-openssl.sh
複製配置好的Setenv-android.sh
的內容到build-android-openssl.sh
,再添加命令:
cd openssl
make clean
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
make all
sudo -E make install CC=$ANDROID_TOOLCHAIN/arm-linux-androideabi-gcc RANLIB=$ANDROID_TOOLCHAIN/arm-linux-androideabi-ranlib複製代碼
注:該腳本和openssl
源碼的目錄是同一級目錄。
完成編譯以後能夠看到/usr/local/ssl/android-23
有生成了對應的庫和文件,OpenSSL源代碼目錄下生成了:libcrypto.so
和libcrypto.a
這樣就完成了Android的OpenSSL
庫編譯完成,下一步就能夠嘗試在NDK中引用OpenSSL了。
優化後的腳本地址:github.com/jjz/script/…