目录
概述
Android系统要求所有的应用必须被证书进行数字签名之后才能进行安装。Android系统通过该证书来确认应用的作者,该证书是不需要权威机构认证的,一般情况下应用都是用开发者的自签名证书,该证书是确保应用程序和应用程序作者之间建立信任关系,而不是用来决定用户可以安装哪些应用程序。
应用进行数字签名的好处和注意事项如下:
- Android所有的应用程序必须要有数字证书签名,Android系统不会安装一个没有数字证书签名的程序。
- Android系统中,系统app使用的是平台证书签名,而第三方app一般使用开发者的自签名证书。
- Release版本的第三方app(例如淘宝、支付宝、微信),必须使用一个合适私钥生成的数字证书来给程序进行签名,并且保证每次的迭代新版本都是使用相同的证书进行数字签名。不然的话,新版本和旧版本的数字证书不一致,Android系统会认为这是两个不同的app,导致更新等操作失败。
- 数字证书是存在有效期的,这也决定了app的预计生命周期,如果数字证书超期失效,则应用无法安装或者无法正常升级。
- Android提供了基于签名的权限机制,那么一个应用程序就可以为另一个以相同证书签名的应用程序公开自己的功能。以同一个证书对多个应用程序进行签名,利用基于签名的权限检查,你就可以在应用程序间以安全的方式共享代码和数据了。 不同的应用程序之间,想共享数据,或者共享代码,那么要让他们运行在同一个进程中,而且要让他们用相同的证书签名。
数字签名证书生成方法
声明:实验生成的keystore只是作为演示使用,并没有实际应用到项目中。大家参考时也要根据我的博客手工修改部分参数,切忌无脑照抄!
Android是使用标准的java工具keytool和jarsigner来生成数字证书,而目前市场上第三方IDE(Android Studio和Eclipse)都是通过图形化系统帮我们封装了这两个工具的具体执行步骤。
接下来,我会介绍两种生成数字签名证书的方式,分别通过命令行和Android Studio进行生成。
命令行工具(keytool&&jarsinger)
由于Android的数字签名证书是用java标准工具生成的(路径为:$JAVA_HOME/bin目录下),那我们当然可以在命令行生成数字证书了,具体方法如下。
- 使用keytool生成数字签名证书。示例命令如下:
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
参数详解:
- -keystore : 指定生成数字签名证书的文件名和路径。
- -alias:指定证书的别名。
- -keyalg:指定生成证书所需要的算法。
- -keysize:指定证书大小。
- -validity:指定证书的有效期,单位为天。
示例截图如下:
- 使用生成的keystore,利用jarsinger为应用进行签名。示例命令如下:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name
参数详解:
- -sigalg:签名算法的名称。
- -digestalg:摘要算法的名称。
- -keystore : 指定签名证书的位置。
- alias_name:签名证书的别名。
示例截图如下:
- google官方同时推荐使用zipalign工具对签名的apk进行优化。该工具位于Android SDK的/build-tools/版本号/目录下。示例命令如下:
zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk
示例截图如下:
Android Studio
使用命令行的方式可以显得geek,并且让我们更多的了解实现细节。但是,平时应用开发中更多的是注重效率,因此,我们可以采用目前google官方推荐的AS帮我们实现应用数字签名功能。具体步骤如下。
- 选择编译Module->Build->Generate Signed APK->选择编译Module->Next。
-
选择Create new,创建一个新的数字签名证书。
-
填写证书信息。
填写完成之后,我们点击OK,就可以生成我们的数字签名证书了。
上述工作完成后,我们就生成了数字签名证书,但是还没有对我们的apk进行签名。想要用生成的数字证书对apk进行签名,还需要修改当前Module的build.gradle文件,增加签名命令,具体内容如下:
android {
compileSdkVersion 19
buildToolsVersion "19.1.0"
defaultConfig {
applicationId "××××××"
minSdkVersion 8
targetSdkVersion 19
}
signingConfigs {
debug {
// 配置debug版本的数字签名证书
storeFile file("/home/wzy/Documents/keystore/simple-weather.jks")
storePassword "123456"
keyAlias "release-key"
keyPassword "123456"
}
release {
// 配置release版本的数字签名证书(为了方便,这里的release版本和debug版本共用一个数字签名证书)
storeFile file("/home/wzy/Documents/keystore/simple-weather.jks")
storePassword "123456"
keyAlias "release-key"
keyPassword "123456"
}
}
buildTypes {
release {
// 配置release版本的数字签名
signingConfig signingConfigs.release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
debug {
// 配置debug版本的数字签名
signingConfig signingConfigs.debug
}
}
lintOptions {
abortOnError false
}
}
当然,上述命令Android Studio也提供了图形化界面进行操作,可以直接在Module Settings进行设置,截图如下(ps:我还是喜欢手动配置)。
小结
Android应用可以在debug和release两种模式下进行数字证书签名。在Android Studio中,我们直接点击Run使用的是debug模式,我们在命令行敲击bash gradle :$module_name:build
使用的是release模式。
debug模式下签名是为了开发调试,release模式下进行签名则是为了正式发布。
Android SDK提供了一个不需要密码的证书用于在debug模式下进行签名调试,默认存储在$HOME/.android/debug.keystore,但是release版本必须使用自己的数字签名证书。
查看应用签名信息
首先,为什么我们需要查看应用签名信息呢?
是因为,很多第三方提供的SDK服务为了区分应用必须让我们提供数字签名的SHA1值,例如百度地图定位SDK、高德地图定位SDK,为了使用这些服务,我们就必须学会如何查看应用签名信息。
查看自签名证书的信息
我们自签名的证书,由于keystore文件存在于我们可访问的路径下,我们可以直接通过keytool命令去查看证书信息。
示例命令如下:
keytool -v -list -keystore my-release-key.keystore
输入命令后,是需要输入签名密码的。
参数详解:
- -list:列出密钥库中的条目。
- -keystore:数字证书位置。
示例截图如下:
查看第三方应用或Android系统应用签名证书信息
其实系统应用对开发者来说也是第三方应用,但是只要我们能拿到它的apk,就能知道它的应用签名信息。以我目前使用的乐运动apk为例(com.oxygen.www_3.0_40.apk)。
- 用unzip命令解压apk。
unzip com.oxygen.www_3.0_40.apk
- 进入META-INF文件,找到其中的CERT.RSA文件。
- 使用keytool工具进行信息查看,具体命令如下:
keytool -printcert -file CERT.RSA
参数详解:
- -printcert:打印证书内容
示例截图如下:
今天的文章Android应用数字签名详解分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/8656.html