android 数字证书具体应用机制
Android手机操作系统作为一款比较流行的开源系统在手机领域占据着举足轻重的地位。 在Android系统中,所有安装到系统的应用程序都必有一个Android数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的protectionLevel为signature,那么就只有那些跟该permission所在的程序拥有同一个数字证书的应用程序才能取得该权限。
Android使用Java的数字证书相关的机制来给apk加盖数字证书,要理解Android数字证书,需要先了解以下数字证书的概念和java的数字证书机制。
基础概念:数字证书:
数字证实是采用数字手段来证实用户身份的一种方法。数字证书含有两部分数据:一部分是对应主体(单位或个人)的信息,另一部分是这个主体所对应的公钥。即数字证书保存了主体和它的公钥的一一对应关系,用于自我认证(向其他的用户证明自己的身份)。
Java数字证书工具。
Java中的keytool.exe可以用来创建数字证书,所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,证书库中的一条证书包含该条证书的私钥,公钥和对应的数字证书的信息。证书库中的一条证书可以导出数字证书文件,数字证书文件只包括主体信息和对应的公钥。
每一个证书库是一个文件组成,它有访问密码,在首次创建时,它会自动生成证书库,并要求指定访问证书库的密码。
在创建证书的的时候,需要填写证书的一些信息和证书对应的私钥密码。这些信息包括 CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx,它们的意思是:
CN(Common Name名字与姓氏)
OU(Organization Unit组织单位名称)
O(Organization组织名称)
L(Locality城市或区域名称)
ST(State州或省份名称)
C(Country国家名称)
可以采用交互式让工具提示输入以上信息,也可以采用参数
-dname "CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx"来自动创建。
例如这条命令:
keytool -genkey -alias testCA -keyalg RSA -keysize 1024 -keystore testCALib -validity 3650
在数字证书库testCALib中创建了一个别名为testCA,使用RSA算法加密的,有效期为3650天的数字证书。
证书生成以后,我们可以使用命名将数字证书导出为一个文件。
keytool -export -alias testCA -file testCA.cer -keystore testALib -rfc
有关keytool的其他用法可以查询keytool的帮助文档。
数字证书生成以后,我们需要使用生成的数字证书给程序包签名,这个是使用jarsigner 工具。例如,如果我们有一个android的程序包calendar.apk.,我们就可以使用刚生成的testCA给改程序包签名。
jarsigner -keystore testCALib calendar.apk testCA.
Android数字证书概述:
Android系统要求每一个安装进系统的应用程序都是经过数字证书签名的,数字证书的私钥则保存在程序开发者的手中。Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,儿不是用来决定最终用户可以安装哪些应用程序。这个数字证书并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的。
Android数字证书包含以下几个要点:
(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
(3)如果要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。
(4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。
(5)Android使用标准的java工具 Keytool and Jarsigner 来生成数字证书,并给应用程序包签名。
Android系统不会安装运行任何一款未经数字签名的apk程序,无论是在模拟器上还是在实际的物理设备上。Android的开发工具(ADT插件和Ant)都可以协助开发者给apk程序签名,它们都有两种模式:调试模式(debug mode)和发布模式(release mode)。
在调试模式下,android的开发工具会在每次编译时使用调试用的数字证书给程序签名,开发者无须关心。
当要发布程序时,开发者就需要使用自己的数字证书给apk包签名,可以有两种方法。
(1)在命令行下使用JDK中的和Keytool(用于生成数字证书)和Jarsigner(用于使用数字证书签名)来给apk包签名
(2)使用ADT Export Wizard进行签名(如果没有数字证书可能需要生成数字证书)
签名策略:
同一个开发者的多个程序尽可能使用同一个数字证书,这可以带来以下好处。
(1)有利于程序升级,当新版程序和旧版程序的数字证书相同时,Android系统才会认为这两个程序是同一个程序的不同版本。如果新版程序和旧版程序的数字证书不相同,则Android系统认为他们是不同的程序,并产生冲突,会要求新程序更改包名。
(2)有利于程序的模块化设计和开发。Android系统允许拥有同一个数字签名的程序运行在一个进程中,Android程序会将他们视为同一个程序。所以开发者可以将自己的程序分模块开发,而用户只需要在需要的时候下载适当的模块。
(3)可以通过权限(permission)的方式在多个程序间共享数据和代码。Android提供了基于数字证书的权限赋予机制,应用程序可以和其他的程序共享概功能或者数据给那那些与自己拥有相同数字证书的程序。如果某个权限(permission)的protectionLevel是signature,则这个权限就只能授予那些跟该权限所在的包拥有同一个数字证书的程序。
另一个需要考虑的是Android数字证书的有效期:
(1)数字证书的有效期要包含程序的预计生命周期,一旦数字证书失效,持有改数字证书的程序将不能正常升级。
(2)如果多个程序使用同一个数字证书,则该数字证书的有效期要包含所有程序的预计生命周期。
(3)Android Market强制要求所有应用程序数字证书的有效期要持续到2033年10月22日以后。
android 数字证书具体应用机制相关推荐
- Android数字证书
为Android/Ophone应用程序签名步骤: 1.确保电脑上安装了JDK,因为我们将使用JDK自带的创建和管理数字证书的工具Keytool.在命令行下输入如下命令: Java代码 keytool ...
- Android--数字签名和数字证书
一.数字签名 1. 概述 数字签名是非对称加密与数字摘要的组合应用 2. 应用场景 校验用户身份(使用私钥签名,公钥校验,只要用公钥能校验通过,则该信息一定是私钥持有者发布的) 校验数据的完整性(用解 ...
- android crt证书,如何在android手机安装数字证书 crt和p12
当点击Wi-Fi Settings, Advanced界面的"安装证书":或者在Settings的Security界面下的CredentialStorage界面点击"安装 ...
- android安装过程图片,Android的数字证书安装过程概述
当你点击Wi-Fi Settings, Advanced界面的"安装证书":或者在Settings的Security界面下的CredentialStorage界面点击"安 ...
- 一文读懂Https的安全性原理、数字证书、单项认证、双项认证等
为什么80%的码农都做不了架构师?>>> 本文引用了作者Smily(博客:blog.csdn.net/qq_20521573)的文章内容,感谢无私分享. 1.前言 目前苹果公司 ...
- Android进程间通信(IPC)机制Binder简要介绍和学习计划
在Android系统中,每一个应用程序都是由一些Activity和Service组成的,这些Activity和Service有可能运行在同一个进程中,也有可能运行在不同的进程中.那么,不在同一个进程的 ...
- Android群英传笔记-Android系统安全与安全机制
Android系统安全与安全机制 系统消息 Android系统消息获取 android.os.Build SystemProperty Android apk 应用信息获取 PackageManage ...
- Tomcat双向SSL认证及CA数字证书安装和配置QQ即时通信协议窥探
1.Java加密与解密的艺术 网络信息安全近几年成为热点.职业发展新方向,常规Web应用如BBS.BLOG.SNS及电子商务等B/S系统是以用户为核心,账号管理是这些系统中唯一的安全屏障:IM即时聊天 ...
- MTK平台Android 安全中secure boot机制
一.相关名词解释 1.公钥:通俗来说,公钥就是公开的密钥,是私钥拥有者公开的,公钥通常用于加密会话密钥.验证数字签名,或加密可以用相应的私钥解密的数据. 2.私钥:私有的钥匙,不会公开,私钥加密又称为 ...
最新文章
- JDBC Driver常用连接方法列表
- Xcode中快速定位、快速查找、快速查看文档、快速解决不再打印等技巧
- 为什么用Go编写机器学习的基础架构,而不是Python?
- 基于nginx的正向代理实现
- 【python学习】模块random
- Python基础教程:列表字典的键值修改
- 切片[:, None, None]的含义
- Spark-shell和Spark-hive的使用
- CVPR 2021 | 超越卷积,自注意力模型HaloNet
- 长途货运4大痛,Uber新上的「自动驾驶卡车」如何改善?
- 机器学习基础(四十五)—— 模拟退火(Simulated Annealing)
- 【算法】排序_选择排序及其优化
- 基于Android的健康打卡系统,基于Android平台的个人健康管理系统
- HDFView 3.1.2win10百度云资源
- iOS 通知扩展插件
- deeping安装Android studio
- 13种常见软件体系结构风格定义分析、结构图、优缺点
- 手机通过RNDIS共享网络
- 海洋cms php环境 多少,海洋cms
- 80后的罗敏已经在创业路上走了十几年
热门文章
- myeclipse自动生成hibernate映射文件的过程
- SpringMVC中@RequestMapping 6个基本用法小结
- (Mybatis)增删改查实现
- mongodb 分组聚合_MongoDB按键值对进行聚合/分组
- 实用的 GitHub 仓库搜索技巧
- mysql50到例题_关于MySQL的经典例题50道 答案参考
- html伪类选择器代码,CSS3中结构性伪类选择器—:first-of-type实现名言标签(代码实例 )...
- ae输出quicktime设置_AE大神再现酷炫神技能,AE中怎么输出带透明通道的视频文件!...
- SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(可回滚)
- Java 线上问题排查神器 Arthas 快速上手与原理浅谈