android 利用数字证书对程序签名

签名的必要性

  一、  防止你已安装的应用被恶意的第三方覆盖或替换掉java

  二、  开发者的身份标识,签名能够防止抵赖等事件的发生。android

        开发Android的人这么多,彻底有可能你们都把类名,包名起成了一个一样的名字,这时候如何区分?签名这时候就是起区分做用的。另外因为开发商可能经过使用相同的Package Name来混淆替换已经安装的程序,签名这时能够能够防止你已安装的应用被恶意的第三方覆盖或替换掉。于是APK若是使用一个key签名,发布时另外一个key签名的文件将没法安装或覆盖老的版本。算法

签名方式

签名有不少种方式,常见的有:微信

  一、  在Eclipse下经过插件获取数字证书,并签名你的应用。less

   打开Eclipse->选择你要签名的项目->右击->android tools->Export signedApplication package,再进行相关操做。这里首先须要建立数字证书,而后再利用数字证书签名你的应用。工具

      运气好时,你会发现签名失败,却怎么也找不到缘由。本人以前就遇到过这种状况,也困惑过很久,最终才发现是插件出问题了,抓狂。那你不妨使用下面一种方法。开发工具

  二、  用KeyTool产生数字证书文件,再签名你的应用。测试

命令:优化

keytool -genkey -v -keystore D:\Users\Administrator\Desktop\mytest.keystore-alias mytest -keyalg RSA -validity 20000

其中参数含义以下:spa

-keystore D:\Users\Administrator\Desktop\mytest.keystore表示生成的证书及其存放路径,默认在用户主目录下;
-alias mytest 表示证书的别名是mytest;
-keyalg RSA 表示采用的RSA算法;
-validity 20000表示证书的有效期是20000天。

这样你就会在相应目录下得到所需的数字证书,如上图所示。

获取到数字证书以后,你就能够用数字证书去签名你的应用,签名步骤以下:

右击工程 --> 选择Android Tools --> Export Signed Application Package --> 选择next  --> 选择Use existing keystore,并填写数字证书位置,以及密码,再next --> using existing key,选择alias,以及密码,再next --> 选择程序存放位置后完成。

 

补充:

有时你可能还须要获得证书指纹(MD5和SHA1)。

一、获取证书指纹(MD5)命令:

  keytool -list -alias mytest -keystore D:\Users\Administrator\Desktop\mytest.keystore

二、获取证书指纹(SHA1)命令:

keytool -list -v -alias mytest -keystore  D:\Users\Administrator\Desktop\mytest.keystore

三、这两条命令只是参数不一样,你也能够同时获取证书指纹(MD5和SHA1),固然-alias后面的别名必定要跟前面的对应。命令以下图所示:

 

数字证书简介:

 

Android数字证书包含如下几个要点: 

 

        在Android系统中,全部安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的做者和在应用程序之间创建信任关系,不是用来决定最终用户能够安装哪些应用程序,数字证书的私钥则保存在程序开发者的手中。这个数字证书并不须要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的。若是一个permission的protectionLevel为signature,那么就只有那些跟permission所在的程序拥有同一个数字证书的应用程序才能取得该权限。

         Android使用Java的数字证书相关的机制来给apk加盖数字证书,要理解android的数字证书,须要先了解如下数字证书的概念和java的数字证书机制。Android系统要求每个安装进系 统的应用程序都是通过数字证书签名的, Android将数字证书用来标识应用程序的做者和在应用程序之间创建信任关系。
(1)全部的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序。
(2)Android程序包使用的数字证书能够是自签名的,不须要一个权威的数字证书机构签名认证。

(3)若是要正式发布一个Android,必须使用一个合适的私钥生成的数字证书来给程序签名 ,而不能使用adt插件或者ant工具生成的调试证书来发布。

        Android的开发工具(ADT插件和Ant)均可以协助开发者给apk程序签名,它们都有两种模式:调试模式(debug mode)发布模式(release mode)。在调试模式下,android的开发工具会在每次编译时使用调试用的数字证书(default.keystore)给程序签名,开发者无须关心。当要发布程序时,开发者就须要使用本身的数字证书给apk包签名。所以,当咱们在开发微信分享功能时候,须要使用发布模式。若是不使用本身生成的数字证书,你将只能在第一次分享成功,之后就一直调不出分享的界面。

(4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。若是程序已经安装在系统中,即便证书过时也不会影响程序的正常功能。Android Market强制要求全部应用程序数字证书的有效期要持续到2033年10月22日之后。
(5)Android使用标准的java工具Keytool和Jarsigner来生成数字证书,并给应用程序包签名。

(6)使用zipalign优化程序。

 

有关签名密钥(证书)与发行包名变化可能有以下限定:

       下面是我本身测试的结果,跟网上的一些资料有些出入,我的认为包主要判断是否属于同一应用,而后签名用来判断程序所属者,判断是否属于不一样版本。有任何问题,欢迎轻拍。

 

  一、包名相同,签名相同:安装时可覆盖安装(就是同一程序同一版本)。

  二、包名相同,签名不一样:Android认为版本发生了变化,需先卸载再安装(同一程序不一样版本)。

  三、包名不一样,签名相同:正常安装。

  四、包名不一样,签名不一样:正常安装。

程序覆盖安装检查:

  (1)、两个程序的入口Activity是否相同。两个程序若是包名不同,即便其它全部代码彻底同样,也不会被视为同一个程序的不一样版本;

  (2)、两个程序所采用的签名是否相同。若是两个程序所采用的签名不一样,即便包名相同,也不会被视为同一个程序的不一样版本,不能覆盖安装。

    总结一下就是:签名、包名相同,需覆盖安装。

     这里有一个很简单的例子:当咱们在公司开发时,在本身电脑上调试的手机,屡次调试时不须要卸载(此时是覆盖安装)。而当其余人拿了这个手机去他电脑上调试时,就须要先卸载该程序(必须卸载安装)。当你之前的程序是采用默认签名的方式(即debug签名),一旦换了新的签名应用将不能覆盖安装,必须将原先的程序卸载掉,才能安装上。

 

        所以使用debug签名的应用:没法在Android市场销售;并且,不一样机器生成的debug密钥不一样,不利apk升级和维护;debug签名有一年有效期。使用独立签名的应用:可在Android市场销售,签名固定会更加便利apk升级和维护。

参考资料:

 

http://blog.csdn.net/wirelessqa/article/details/7651613

http://blog.csdn.net/lyq8479/article/details/6401093

http://blog.csdn.net/wenlin56/article/details/8153301

 

 

本文转自:http://blog.csdn.net/qianfu111/article/details/9113887

相关文章
相关标签/搜索