美文网首页
AOSP系统签名的生成以及替换

AOSP系统签名的生成以及替换

作者: momxmo | 来源:发表于2020-04-06 22:14 被阅读0次

    一、简述

    首先,我们先了解一下签名的类型有哪些?
    Android标准签名key文件位于源码/build/target/product/security目录下,四组默认签名供Android.mk在编译APK使用。主要有4个key:

    • testkey:普通签名APK,默认情况下使用。
    • platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。
    • shared:该APK需要和home/contacts进程共享数据。
    • media:该APK是media/download系统中的一环。

    应用程序的Android.mk中有一个LOCAL_CERTIFICATE字段,由它指定哪个key签名,未指定的默认用testkey.
    build/target/product/security目录下查看:

    mo@ubuntu:~/AOSP/android6.0/build/target/product/security$ ls
    Android.mk      platform.x509.pem  testkey.pk8       verity.x509.pem
    media.pk8       README             testkey.x509.pem
    media.x509.pem  shared.pk8         verity_key
    platform.pk8    shared.x509.pem    verity.pk8
    
    

    .pk8代表私钥,.x509.pem公钥,它们都是成对出现;
    testkey是作为android编译的时候默认的签名key,如果系统中的apk的Android.mk中没有设置LOCAL_CERTIFICATE的值,就默认使用testkey。

    而如果设置成:

    LOCAL_CERTIFICATE := platform
    

    就代表使用platform来签名,这样的话这个apk就拥有了和system相同的签名,因为系统级别的签名也是使用的platform来签名,此时使用android:sharedUserId="android.uid.system"才有用!

    二、自定义签名

    1.key生成签名

    /build/target/product/security目录下有个README,里面说明了怎么制作这些key以及使用

    For detailed information on key types and image signing, please see:
    
    https://source.android.com/devices/tech/ota/sign_builds.html
    
    The test keys in this directory are used in development only and should
    NEVER be used to sign packages in publicly released images (as that would
    open a major security hole).
    
    key generation
    --------------
    
    The following commands were used to generate the test key pairs:
    
      development/tools/make_key testkey  '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
      development/tools/make_key platform '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
      development/tools/make_key shared   '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
      development/tools/make_key media    '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
    
    signing using the openssl commandline (for boot/system images)
    --------------------------------------------------------------
    
    1. convert pk8 format key to pem format
       % openssl pkcs8 -inform DER -nocrypt -in testkey.pk8 -out testkey.pem
    
    2. create a signature using the pem format key
       % openssl dgst -binary -sha1 -sign testkey.pem FILE > FILE.sig
    
    extracting public keys for embedding
    ------------------------------------
    
    dumpkey.jar is a Java tool that takes an x.509 certificate in PEM format as
    input and prints a C structure to standard output:
    
        $ java -jar out/host/linux-x86/framework/dumpkey.jar build/target/product/security/testkey.x509.pem
        {64,0xc926ad21,{1795090719,2141396315,950055447,2581568430,4268923165,1920809988,546586521,3498997798,1776797858,3740060814,1805317999,1429410244,129622599,1422441418,1783893377,1222374759,2563319927,323993566,28517732,609753416,1826472888,215237850,4261642700,4049082591,3228462402,774857746,154822455,2497198897,2758199418,3019015328,2794777644,87251430,2534927978,120774784,571297800,3695899472,2479925187,3811625450,3401832990,2394869647,3267246207,950095497,555058928,414729973,1136544882,3044590084,465547824,4058146728,2731796054,1689838846,3890756939,1048029507,895090649,247140249,178744550,3547885223,3165179243,109881576,3944604415,1044303212,3772373029,2985150306,3737520932,3599964420},{3437017481,3784475129,2800224972,3086222688,251333580,2131931323,512774938,325948880,2657486437,2102694287,3820568226,792812816,1026422502,2053275343,2800889200,3113586810,165549746,4273519969,4065247892,1902789247,772932719,3941848426,3652744109,216871947,3164400649,1942378755,3996765851,1055777370,964047799,629391717,2232744317,3910558992,191868569,2758883837,3682816752,2997714732,2702529250,3570700455,3776873832,3924067546,3555689545,2758825434,1323144535,61311905,1997411085,376844204,213777604,4077323584,9135381,1625809335,2804742137,2952293945,1117190829,4237312782,1825108855,3013147971,1111251351,2568837572,1684324211,2520978805,367251975,810756730,2353784344,1175080310}}
    
    This is called by build/core/Makefile to incorporate the OTA signing keys
    into the recovery image.
    

    从README可知,key是通过development/tools目录下的make_key脚本生成的,脚本需要传入两个参数。其中第一个参数是key的名字,我们可以不修改,使用aosp默认的4个key的名字;第二个参数即是具体的一些属性,此为key真正的关键(我们需要修改的部分),下面对第二个参数的一些具体属性做出分析解释:

    C —> Country Name (2 letter code)
    ST —> State or Province Name (full name)
    L —> Locality Name (eg, city)
    O —> Organization Name (eg, company)
    OU —> Organizational Unit Name (eg, section)
    CN —> Common Name (eg, your name or your server’s hostname)
    emailAddress —> Contact email address

    另外在是用make_key生成key的过程中会提示输入password,一般是不输入,直接enter的。

    2.删除已存在的key

    进入到/build/target/product/security目录执行如下命令:

    rm ./*.p*
    

    删除全部已存在的key,然后重新生成新的key。

    3.生成key

    返回到AOSP的根目录,使用make_key脚本去生成4个签名key。

    testkey
    ./development/tools/make_key build/target/product/security/testkey '/C=CN/ST=ShenZhen/L=ShenZhen/O=momxmo/OU=mo/CN=www.momxmo.com/emailAddress=test@126.com'
    
    platform
    ./development/tools/make_key build/target/product/security/platform '/C=CN/ST=ShenZhen/L=ShenZhen/O=momxmo/OU=mo/CN=www.momxmo.com/emailAddress=test@126.com'
    
    media
    ./development/tools/make_key build/target/product/security/media '/C=CN/ST=ShenZhen/L=ShenZhen/O=momxmo/OU=mo/CN=www.momxmo.com/emailAddress=test@126.com'
    
    shared
    ./development/tools/make_key build/target/product/security/shared '/C=CN/ST=ShenZhen/L=ShenZhen/O=momxmo/OU=mo/CN=www.momxmo.com/emailAddress=test@126.com'
    

    我们可以自定义key_create.sh脚本生成秘钥放到aosp根目录下,脚本代码如下:

    subject='/C=CN/ST=ShenZhen/L=ShenZhen/O=momxmo/OU=mo/CN=www.momxmo.com/emailAddress=test@126.com'
    for x in releasekey platform shared media;
    do
      ./development/tools/make_key build/target/product/security/$x "$subject";
    done
    
    4.验证key

    在生成4个key后,再使用OpenSSL的工具来验证一下生成的key是否正常。
    进入到/build/target/product/security目录,执行如下命令:

    openssl x509 -noout -subject -issuer -in media.x509.pem
    

    输出:

    subject= /C=CN/ST=ShenZhen/L=ShenZhen/O=momxmo/OU=mo/CN=www.momxmo.com/emailAddress=test@126.com
    issuer= /C=CN/ST=ShenZhen/L=ShenZhen/O=momxmo/OU=mo/CN=www.momxmo.com/emailAddress=test@126.com
    

    另外3个key的验证类似media,就不再多做介绍。

    5.修改系统默认签名key

    在上面提到如果apk中的编译选项LOCAL_CERTIFICATE没有设置的话,就会使用默认的testkey作为签名key,我们可以修改成自己想要的key,按照上面的步骤制作一个releasekey,
    a.修改android配置在/build/core/config.mk中定义变量:

    DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/testkey
    

    TO

    DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/releasekey
    

    b.修改android配置在/build/core/Makefile.mk中定义变量:

     ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/releasekey)  
        BUILD_VERSION_TAGS += release-keys 
    

    这样的话默认的所有签名将会使用releasekey
    c.修改system/sepolicy/private/keys.conf 和 system/sepolicy/prebuilts/api/{apilevel}/private/keys.conf

    [@RELEASE]
    ENG       : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem
    USER      : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem
    USERDEBUG : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem
    
    验证打包编译好的系统使用的签名

    编译完成之后也可以在build.prop中查看到变量:

    adb root //获取root权限
    adb remount
    adb shell
    cd system
    cat build.prop 
    

    会看到一行ro.build.tags=release-keys

    6.生成 generate_verity_key

    make generate_verity_key (mmm system/extras/verity/)
    首先,先生成veritykey签名

    development/tools/make_key veritykey   '/C=CN/ST=ShenZhen/L=ShenZhen/O=momxmo/OU=mo/CN=www.momxmo.com/emailAddress=test@126.com'
    

    然后执行

    out/host/linux-x86/bin/generate_verity_key -convert veritykey.x509.pem verity_key
    

    拷贝veritykey.pk8veritykey.x509.pemverity_key.pubbuild/target/product/security/ 目录,将其重命名:verity.pk8, verity.x509.pem,verity_key,并替换相应的 key。

    根据以上步骤把生成的相应的key替换系统中build/target/product/security/ 目录下的key后重新编译系统,即可使用自己生成的系统签名key

    三、系统key文件生成keystore

    生成keystore文件主要是给外部apk开发签名使用的;
    以常用的platform签名为例:

    //如果之前没有生成platform.pem文件,现在可以执行以下命令生成
    openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem
    
    //生成platform.p12文件,设置对应的密码和alias名(app签名使用到)
    openssl pkcs12 -export -in platform.x509.pem -out platform.p12 -inkey platform.pem -password pass:密码 -name 名称
    
    //生成platform.jks(app使用的签名文件),启动
    keytool -importkeystore -deststorepass 密码 -destkeystore ./platform.keystore -srckeystore ./platform.p12 -srcstoretype PKCS12 -srcstorepass 密码
    
    //剩下的就是将platform.jks拷贝到app工程目录下设置alias名和密码即可
    

    最终的platform.keystore即为我们所要的keystore

    相关文章

      网友评论

          本文标题:AOSP系统签名的生成以及替换

          本文链接:https://www.haomeiwen.com/subject/vqybphtx.html