大家好,又见面了,我是你们的朋友全栈君。
因为做了太多的终端项目,客户总会有自己的apk提供,这时候各种签名问题就来了,最近整理了一下相关知识,分享给大家。
签名的用处:
1.应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名。这是由于只有以同一个证书签名,系统才会允许安装升级的应用程序。如果你采用了不同的证书,那么系统会要求你的应用程序采用不同的包名称,在这种情况下相当于安装了一个全新的应用程序。如果想升级应用程序,签名证书要相同,包名称要相同!
2.应用程序模块化:Android系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序,此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立的升级其中的一个模块
3.代码或者数据共享:Android提供了基于签名的权限机制,那么一个应用程序就可以为另一个以相同证书签名的应用程序公开自己的功能。以同一个证书对多个应用程序进行签名,利用基于签名的权限检查,你就可以在应用程序间以安全的方式共享代码和数据了。
举个例子,如果你里面的apk是签名A,但是外面同包名的apk是签名B,那是install不进去的;
再比如一个apk你使用它自身的签名预置进系统,那它只会有普通权限,而如果签了平台签名,则会有很多系统权限,具体权限可以查看frameworks/base/core/res/AndroidManifest.xml文件。
一.平台签名
首先说一下接触最多的平台签名(platform signature),也称为系统签名.
下面方法中platform.x509.pem和platform.pk8文件可能是alps/build/target/product/security/ 中的,也有可能alps/device/mediatek/common/security/中的,具体需要查看MTK_SIGNATURE_CUSTOMIZATION这个宏为yes的就是alps/device/mediatek/common/security/,反之,具体逻辑如下:
ifeq ($(MTK_SIGNATURE_CUSTOMIZATION),yes)
ifeq ($(wildcard device/mediatek/security/$(strip $(MTK_TARGET_PROJECT))),)
$(error Please create device/mediatek/security/$(strip $(MTK_TARGET_PROJECT))/ and put your releasekey there!!)
else
PRODUCT_DEFAULT_DEV_CERTIFICATE := device/mediatek/security/$(strip $(MTK_TARGET_PROJECT))/releasekey
endif
1.在N之前的签名方法为
在已经编译好的工程中 :out/host/linux-x86/framework/路径 取出 signapk.jar 文件 ,然后从 alps/build/target/product/security/ 下面取出另外两个文件 platform.x509.pem 和 platform.pk8
然后三个文件+apk文件,放在同一个路径下。
执行签名操作:
java -jar signapk.jar platform.x509.pem platform.pk8 input.apk(原始的apk) output.apk(生成的apk)
然后apk就相当于系统签名了,获取了系统权限(以后会有一篇讲权限的)。
2.在N或者之后
在alps路径下:
java -Xmx2048m -Djava.library.path=”out/host/linux-x86/lib64″ -jar out/host/linux-x86/framework/signapk.jar build/target/product/security/platform.x509.pem build/target/product/security/platform.pk8 input.apk(原始的apk) output.apk(生成的apk)
当然也可以拿出out/host/linux-x86/lib64/ ,out/host/linux-x86/framework/signapk.jar,build/target/product/security/platform.x509.pem,build/target/product/security/platform.pk8等文件拿出来放在一起,但是路径就得记得修改了,所以建议直接在alps下运行该命令。
3.查看是否签名成功
1)解压apk
2)进入解压出来的文件夹,其中有一个META-INF文件夹,在该文件夹位置打开终端,输入:
keytool -printcert -file XXXX.RSA(一般来讲会是CERA.RSA)
然后就可以从下面这些信息看出是否成功:
还有一种方式是运行jarsigner -verify -verbose -certs xxx.apk(你的签完的apk) >log.txt
log.txt会打出签名信息,也能够看出。
4.生成平台签名的步骤
平台签名步骤
在alps路径下:
1、development/tools/make_key releasekey ‘/C=xx/ST=xx/L=xx/O=xx/OU=xx/CN=xx/emailAddress=xxx@xx.com’
development/tools/make_key platform ‘/C=xx/ST=xx/L=xx/O=xx/OU=xx/CN=xx/emailAddress=xxx@xx.com’
development/tools/make_key media ‘/C=xx/ST=xx/L=xx/O=xx/OU=xx/CN=xx/emailAddress=xxx@xx.com’
development/tools/make_key shared ‘/C=xx/ST=xx/L=xx/O=xx/OU=xx/CN=xx/emailAddress=xxx@xx.com’
development/tools/make_key testkey ‘/C=xx/ST=xx/L=xx/O=xx/OU=xx/CN=xx/emailAddress=xxx@xx.com’
不要输密码,密码为空,除非你能忍受编译的时候隔几分钟要你输一次密码,或者自己写脚本输密码
2、拷贝到alps/device/mediatek/common/security/
3、MTK_SIGNATURE_CUSTOMIZATION = no –> MTK_SIGNATURE_CUSTOMIZATION = yes
4、MTK_INTERNAL = no(如果有)
上面的信息对应:
‘/C=xx/ST=xx/L=xx/O=xx/OU=xx/CN=xx/emailAddress=xxx@xx.com’
What is your first and last name?(CN)
What is the name of your organizational unit?(OU)
What is the name of your organization?(O)
What is the name of your City or Locality?(L)
What is the name of your State or Province?(ST)
What is the two-letter country code for this unit?(C)
What is the email address?
关于这几个签名对应的意义:
1)testkey/releasekey:普通APK,默认情况下使用。
2)platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。
3)shared:该APK需要和home/contacts进程共享数据。
4)media:该APK是media/download系统中的一环。
5.生成.jks
很多时候可以是需要拿这签名去开发的,要是每次都使用命令使用 platform.x509.pem和platform.pk8文件去签那就实在太麻烦了,需要生成apk然后再拿出来签,所以我们可以生成一个keystore文件让他们直接在andorid studio上用。
1.openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem
2.openssl pkcs12 -export -in platform.x509.pem -out platform.p12 -inkey platform.pem -password pass:xxx(xxx是密码) -name xxx(xxx是别名)
3.keytool -importkeystore -deststorepass xxx(xxx是密码) -destkeystore ./xxx.jks(xxx就是keystore的名称) -srckeystore ./platform.p12 -srcstoretype PKCS12 -srcstorepass xxx(xxx是密码)
这样的话会生成一个xxx.jks文件,这个文件就是keystore文件,该文件可以改成keystore后缀,当然也可以不修改,然后就可以将他提供给客户作开发用了。
6.源码中使用平台签名
makefile(比如预置apk时的android.mk)中加入:
LOCAL_CERTIFICATE := platform
编译进去就是用的平台签名。
二.普通签名
1.生成签名文件
有两种方式,
1)android studio:
首先Build—Generate Signed Apk,然后选择Create new… ,接着就可以写入信息了,写入后选择.jks文件的存放路径就可以了。
2)终端生成:
首先输入keytool -genkey -v -keystore android.keystore(xxx即为keystore名称) -alias xxx (xxx为别名) -keyalg RSA -validity 3650,接着照着提示输入信息:
然后就生成了keystore了。
2.使用keystore签名
1)Android studio:
首先Build—Generate Signed Apk,然后就不用新建了,直接使用原来的.jks文件,输入密码和别名,生成apk就行了。
2)使用终端:
jarsigner -verbose -keystore xxx.keystore(原先生成的keystore) -signedjar xxx_signed.apk(签名后的apk名称,”signed”不为必须,建议这么写,好区分) -digestalg SHA1 -sigalg MD5withRSA PhoneBook.apk(需要签名的apk名称) xxx(keystore别名)
运行该命令之后就会生成已签名的xxx_signed.apk
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/134683.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...