OpenSSL für Android compilieren

Submitted by admin on So., 11.12.2016 - 12:00

Mit dem folgenden Skript kann man OpenSSL für Android compilieren.

Voraussetzungen

  • Android Studio 3.0.1 oder neuer
  • In Android Studio -> SDK-Manager muss auch ndk installiert sein

Das Skript mk-openssl-android.sh:

#!/bin/sh

################################################################
# prerequisites
# * Android Studio
# * You Android ndk (select this in Android Studio -> Android SDK)
################################################################

# ==> Select latest version for security reasons
ANDROID_VERSION="23"
ABI_VERSION="4.9"

MY_HOME="$HOME"

# ==> You _must_ change this!
cd "${MY_HOME}/Development-cf/openssl" || exit 1

# Android Studio MacOS:
# ==> Need to be changed if not MacOS
NDK="${MY_HOME}/Android/Sdk/ndk-bundle"
export NDK

OPENSSL_OPTIONS="no-shared enable-tls1_3"

OPENSSL_DIR="openssl-git"

if [ ! -d "${OPENSSL_DIR}" ]; then
  git clone --depth 10 https://github.com/openssl/openssl.git "${OPENSSL_DIR}"
  # 04.04.2017: Draft 19 not supported by browsers :-/
  #             see https://mta.openssl.org/pipermail/openssl-dev/2017-March/009146.html
  cd "${OPENSSL_DIR}" || failed
  #git checkout tls1.3-draft-18 || failed
  #git checkout OpenSSL_1_1_1-pre2 || failed
  cd ..
fi

cd "${OPENSSL_DIR}" || exit 1

$NDK/build/tools/make-standalone-toolchain.sh --platform=android-${ANDROID_VERSION} --toolchain=arm-linux-androideabi-${ABI_VERSION} --install-dir=`pwd`/android-toolchain-arm

export TOOLCHAIN_PATH=`pwd`/android-toolchain-arm/bin
export TOOL=arm-linux-androideabi
export NDK_TOOLCHAIN_BASENAME=${TOOLCHAIN_PATH}/${TOOL}
export CC=$NDK_TOOLCHAIN_BASENAME-gcc
export CXX=$NDK_TOOLCHAIN_BASENAME-g++
export LINK=${CXX}
export LD=$NDK_TOOLCHAIN_BASENAME-ld
export AR=$NDK_TOOLCHAIN_BASENAME-ar
export RANLIB=$NDK_TOOLCHAIN_BASENAME-ranlib
export STRIP=$NDK_TOOLCHAIN_BASENAME-strip
export ARCH_FLAGS=""
export ARCH_LINK=""
export CPPFLAGS=" ${ARCH_FLAGS} -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
export CXXFLAGS=" ${ARCH_FLAGS} -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 -frtti -fexceptions "
export CFLAGS=" ${ARCH_FLAGS} -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
export LDFLAGS=" ${ARCH_LINK} "

./Configure -fPIC -fPIE -pie linux-armv4 --openssldir=/data/openssl ${OPENSSL_OPTIONS}

PATH=$TOOLCHAIN_PATH:$PATH make

DEST="apps/openssl"

$NDK/toolchains/arm-linux-androideabi-${ABI_VERSION}/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip "$DEST"

$NDK/toolchains/arm-linux-androideabi-${ABI_VERSION}/prebuilt/linux-x86_64/bin/arm-linux-androideabi-readelf -l "$DEST"

cp -a apps/openssl ../openssl

echo "adb push openssl /sdcard/Download/openssl"
echo "do move openssl to /system/bin (needs root)"
 

Es werden auch die richtigen Compilerflags gesetzt, damit das OpenSSL Executable position independent ist. Ansonsten verweigert Android in den aktuellen Versionen die Ausführung.

Installation

Mit adb wird das Binary in Android unter /data/openssl abgelegt. Weiterhin benötigt man aus dem OpenSSL Source Code noch die openssl.cnf, die ebenfalls nach /data/openssl zu kopieren ist.