【精华分享】Android签名证书你知多少?

作者: 楼建芳
2017-08-18
2392
原创

关于移动端上的应用,我们都知道iOS系统要求所有应用都需要使用苹果颁发的证书进行签名,应用开发商想获得苹果颁发的证书就必须到苹果那里注册加入iOS开发项目组,开发者在获得证书后才有权利向App Store提交和发布应用。


关于Android应用的签名大家可能会相对比较忽视,因为作为Android系统的主导公司Google,并没有象苹果那样要求开发者向它申请证书才能发布应用。但是实际上Android系统也是要求每个Android应用程序是必须要经过数字签名才能安装到系统中的,包括Debug的Android应用。但是Android应用的数字签名是由应用程序的开发者完成的,不需要权威的数字证书签名机构认证。今天我们就来谈谈Android的应用签名相关的那些事。

签名模式】

Android APK数字签名的两种模式:调试模式(debug mode)和发布模式(release mode)。


▪ 调试模式(debug mode)

在调试模式下,开发工具会自动地使用debug密钥为应用程序签名,这个对开发者来说是无感知的,会让人误会以为Debug应用是不需要签名的。

▪ 发布模式(release mode)

在发布模式下,开发者有显式地对APK进行签名的一个过程,在Android studio中,可以通过build->generate Signed APK对APK进行手动签名,也可以通过在build.gradle中的android.signingConfigs来进行自动签名。


【证书使用场景】

程序升级

当新版程序和旧版程序的数字证书和AppID相同时,Android系统才会认为这两个程序是同一个程序的不同版本。如果新版程序和旧版程序的数字证书不相同,但AppID一样,Android系统认为他们是不同的程序,并产生冲突,会要求新程序更改AppID。


  程序插件化设计和开发

插件化开发时,需要确保各插件的数字证书是相同的。Android系统允许拥有同一个数字签名的程序运行在一个进程中,Android程序会将他们视为同一个程序。所以开发者可以将自己的程序分模块开发,而用户只需要在需要的时候下载适当的模块。


 通过权限(permission)的方式在多个程序间共享数据和代码

Android提供了基于数字证书的权限赋予机制,应用程序可以和其他的程序共享功能或者数据给那些与自己拥有相同数字证书的程序。如果某个权限(permission)的protectionLevel是signature,则这个权限就只能授予那些跟该权限所在的包拥有同一个数字证书的程序。


【Android证书相关要点】

▪ 数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。程序有效期内被安装后,即使证书过期也不会影响程序的正常功能了。

▪ 如果计划将应用程序发布到Android Market, 为应用签名的key的有效期必须在2033年10月22日以后,Market服务器强制执行这个规则。

▪ debug.keystore在不同的机器上所生成的可能都不一样,即如果不同开发机器上生成的相同App有可能不会覆盖安装。

 大部分应用程序商店(包括谷歌Play商店)不会接受调试证书签名的APK。

▪ 证书中的有效期、证书持有者姓名、组织名称、城市及国家等信息不影响证书是否相同的判定,即只要证书公私钥信息一致,系统就判定证书相同。


【生成数字证书生成】

通过java标准工具keytool(路径为:$JAVA_HOME/bin目录下)来生成,示例如下(具体用法可自行网上搜索):

▪ 通过Android Stduio工具中的Build->generate Signed APK来生成。


【APK中的签名验证】

1.签名信息

将APK解包后,有一个叫做META-INF的文件夹,存储的是关于签名的一些信息。里面有3个文件:CERT.RSA,CERT.SF,MANIFEST.MF。

▪ Manifest.MF:该文件可以通过文本编辑工具打开查看,可以看到包含了每一个文件(包括资源文件)的哈希值(BASE64)。如图所示:



 CERT.SF: 到跟manifest.mf中的很类似,也是BASE64编码的哈希值,是对MANIFEST.MF的每个条目再次计算摘要后的文件。如图所示:


▪ CERT.RSA:这个文件就无法用文本编辑工具打开了,内容一般包括:开发者信息+开发者公钥 +CA的签名( CA对前两部分做hash值然后私钥加密之后的密文)


2.签名验证

验证过程是:提取公钥,用公钥对CA签名进行解密,然后对前两部分hash,跟CA签名进行对比,看是否相同。


【APK反编译与签名】

签名无法防止APK的反编译,如上所说,签名在程序升级、数据共享及应用有效期方面进行限定。即APK在反编译修改程序后,要覆盖安装原来的应用,是有难度的,除非获取到了原应用的数字证书(或公私钥)。



恒生技术之眼原创文章,未经授权禁止转载。详情见(点击)转载须知

恒生技术之眼