关于 Android 签名的相关概念可参看 Android中签名、证书、公钥密钥的概念及使用

Android 中有两种签名方式:

  • 1、在源码编译环境中,使用 platform 签名文件 platform.x509.pem、platform.pk8 对 apk 进行签名
  • 2、在 Android Studio 或 Eclipse 等 IDE 中,一般采用 keystore 文件对 apk 进行签名

本文讨论如何将二者进行互相转换

一、将 x509.pem + pk8 文件转换成 keystore 文件

该方式需要 keytool-importkeypair 脚本,可在 gayhub 下载

eg: 将 Android 源码中的原生签名转换为 keystore 供 Android Studio 使用

# -k fileName 生成的 keystore 文件路径# -p password 生成的 keystore 密钥库口令# -pk8 fileName 输入 pk8 文件路径# -cert fileName 输入 cert 文件路径# -alias 生成的密钥库别名./keytool-importkeypair -k platform.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platform

查看验证

[email protected]:~/签名/android签名$ keytool -list -v -keystore platform.keystore 输入密钥库口令:  (android)密钥库类型: JKS密钥库提供方: SUN您的密钥库包含 1 个条目别名: platform创建日期: 2017-8-25条目类型: PrivateKeyEntry证书链长度: 1证书[1]:所有者: [email protected], CN=Android, OU=Android, O=Android, L=Mountain View, ST=California, C=US发布者: [email protected], CN=Android, OU=Android, O=Android, L=Mountain View, ST=California, C=US序列号: b3998086d056cffa有效期开始日期: Wed Apr 16 06:40:50 CST 2008, 截止日期: Sun Sep 02 06:40:50 CST 2035...

Android Studio 中使用该 keystore:

signingConfigs {    release {        File strFile = new File("../app/keystore/android/platform.keystore")        storeFile file(strFile)        keyAlias 'platform'        keyPassword 'android'        storePassword 'android'    }    debug {        File strFile = new File("../app/keystore/android/platform.keystore")        storeFile file(strFile)        keyAlias 'platform'        keyPassword 'android'        storePassword 'android'    }}buildTypes {    release {        signingConfig signingConfigs.release        minifyEnabled false        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'    }    debug {        signingConfig signingConfigs.debug    }}

二、将 keystore 文件转换成 x509.pem + pk8 文件

需要安装有 keytool、openssl 工具

2.1 手动转换

2.1.1 先把 keystore 文件转换为 pkcs12 格式

keytool -importkeystore -srckeystore platform.keystore -destkeystore tmp.p12 -srcstoretype JKS -deststoretype PKCS12# orkeytool -importkeystore -srckeystore platform.keystore -srcstorepass android -destkeystore tmp.p12 -deststorepass android -srcstoretype JKS -deststoretype PKCS12 

2.1.2 将 PKCS12 dump 成 pem,这样就可以按照文本形式查看了

openssl pkcs12 -in tmp.p12 -nodes -out tmp.rsa.pem

2.1.3 复制 “BEGIN CERTIFICATE” 至 “END CERTIFICATE” 中间的内容到 cert.x509.pem(新文件)

# 包括首尾两行,此处应该包含cat tmp.rsa.pem | sed -n "/BEGIN CERTIFICATE/,/END CERTIFICATE/p" > cert.x509.pem# orcat tmp.rsa.pem | sed -n '/BEGIN CERTIFICATE/,/END CERTIFICATE/p' > cert.x509.pem# 不包括首尾两行,这里用不到,写在这里当作学习记录# 这里用双引号会出错,原因不知...cat tmp.rsa.pem | sed -n '/BEGIN CERTIFICATE/,/END CERTIFICATE/{//!p}' > cert.x509.pem

2.1.4 复制 “BEGIN RSA PRIVATE KEY” “END RSA PRIVATE KEY” 到 private.rsa.pem(新文件)

# 包括首尾两行,此处应该包含# 有些带RSA,有些不带,此处都可匹配cat tmp.rsa.pem | sed -n '/BEGIN.*PRIVATE KEY/,/END.*PRIVATE KEY/p' > private.rsa.pem

2.1.5 生成pk8格式的私钥

# 不加密openssl pkcs8 -topk8 -outform DER -in private.rsa.pem -inform PEM -out private.pk8 -nocrypt# or 接下来输入密码openssl pkcs8 -topk8 -outform DER -in private.rsa.pem -inform PEM -out private.pk8 

完毕,收集文件 cert.x509.pem 和 private.pk8,其余的中间文件删除即可

用法:

java -jar signapk.jar cert.x509.pem private.pk8 unsigned.apk signed.apk

2.2 自动方式,封装成脚本

./keytool-exportkeypair -k platform.keystore -p android -alias platform

附上keytool-exportkeypair代码:

#! /bin/bashkeystore=""pk8=""alias=""passphrase=""tmpdir=""scriptname=`basename $0`usage() {cat << EOFusage: ${scriptname} -k keystore [-p storepass] -pk8 pk8 -cert cert -alias key_aliasThis script is used to export a key/certificate pair from a Java keystore.A keystore should be specified.The passphrase can also be read from stdin.EOF}cleanup() {    if [ ! -z "${tmpdir}" -a -d ${tmpdir} ]; then        rm -fr ${tmpdir}    fi}while [ $# -gt 0 ]; do    case $1    in        -p | --passphrase | -passphrase)            passphrase=$2            shift 2    ;;        -h | --help)            usage            exit 0    ;;        -k | -keystore | --keystore)            keystore=$2            shift 2    ;;        -pk8 | --pk8 | -key | --key)            pk8=$2            shift 2    ;;        -a | -alias | --alias)            alias=$2            shift 2    ;;        *)            echo "${scriptname}: Unknown option $1, exiting" 1>&2            usage            exit 1    ;;    esacdone# if [ -z "${pk8}" -o -z "${cert}" -o -z "${alias}" ]; thenif [ -z "${alias}" ]; then    echo "${scriptname}: Missing option, exiting..." 1>&2    usage    exit 1fi# for f in "${pk8}" "${cert}" "${keystore}"; dofor f in "${keystore}"; do    if [ ! -f "$f" ]; then        echo "${scriptname}: Can't find file $f, exiting..." 1>&2        exit 1    fidone# Create temp directory ofr key and pkcs12 bundletmpdir=`mktemp -q -d "/tmp/${scriptname}.XXXXXX"`if [ $? -ne 0 ]; then    echo "${scriptname}: Can't create temp directory, exiting..." 1>&2    exit 1fikey="${tmpdir}/key"p12="${tmpdir}/tmp.p12"pems="${tmpdir}/tmp.rsa.pem"pem="${tmpdir}/private.rsa.pem"if [ -z "${passphrase}" ]; then    # Request a passphrase    read -p "Enter a passphrase: " -s passphrase    echo ""fi# Convert keystore to pkcs12keytool -importkeystore -srckeystore "${keystore}" -srcstorepass "${passphrase}" -destkeystore "${p12}" -deststorepass "${passphrase}" -srcstoretype JKS -deststoretype PKCS12 # Convert pkcs12 to PEMopenssl pkcs12 -nodes -in "${p12}" -out "${pems}" -password pass:"${passphrase}"# extract CERTIFICATEecho "extract certificate to \"${alias}.x509.pem\""cat "${pems}" | sed -n '/BEGIN CERTIFICATE/,/END CERTIFICATE/p' > "${alias}.x509.pem"# extract PRIVATE KEYcat "${pems}" | sed -n '/BEGIN.*PRIVATE KEY/,/END.*PRIVATE KEY/p' > "${pem}"# Convert private key to pk8echo "extract private key to \"${alias}.pk8\""openssl pkcs8 -topk8 -inform PEM -outform DER -nocrypt -in "${pem}" -out "${alias}.pk8"cleanup

更多相关文章

  1. Android.mk简介
  2. Android(安卓)文件系统获取root权限
  3. LinuxMint下让adb工具识别android设备
  4. Android(安卓)NDK编程入门
  5. android keystore的使用
  6. Android修改程序名称(包名)总结
  7. 断点下载
  8. android-pull方式解析xml文件以及XML文件的序列化
  9. android 实现左右滑动效果

随机推荐

  1. Android 实现MD5加密
  2. ListView入门级单击,长按监听
  3. Android ProgressDialog简单实例
  4. android登录超时显示demo
  5. 模拟头条
  6. Android 应用获取通知栏权限
  7. android java 网络检测
  8. Android可视化统计模块
  9. android之Widget01
  10. Android(安卓)Studio 高版本无法执行Java