自学Android应用开发也有半年多了,其间也写了很多具有一定功能的小Demo。最近想把自己写的一些功能比较完善的应用放到应用市场上,也算是对自己这半年来学习的一次小总结。
问题来了,之前一直都是用自己手机做的测试,应用证书也是用的eclipse自动生成的调试证书,如何生成自己的证书呢,网上查了相关资料后,记下来,供大家参考。
首先,签名的作用是什么?
说白了就相当于开发者的数字身份证,即使两个应用包名和类名都一样,Android系统仍可以通过签名的不同来区分两个不同的应用。
数字签名的特点
- 所有的应用都是有签名的,没有不存在签名的应用,即使是你的直接用eclipse生成的应用,也是被打了一个调试证书的应用;
- 证书不需要权威机构认证,任何开发者都可以自己生成证书;
- 我们测试应用时,eclipse会自动为应用打上一个调试证书;
- 每个证书都是有期限的,但是只有在应用安装时才会检查证书期限;
- 正式发布应用时,不能使用调试证书,必须用自己的私钥给应用生成一个合适的数字证书。
数字签名生成的方法:
一、使用eclipse自带的工具生成证书和签名APK
- 右键你需要打包的项目—〉Android Tools—〉Export Signed Application Package(Export Unsigned Application Package生成的是未签名APK)
- 点击下一步
- 选择使用已有的证书或者新生一个证书
- 把该填的信息填上,最后设置生成APK文件的位置,点击确定后,经过签名的APK文件就生成了
二、使用JDK自带工具利用命令行生成证书
JDK自带两个证书生成工具keytool和jarsigner,这两个工具在JDK安装目录下
keytool 是个密钥和证书管理工具。jarsigner 工具利用密钥仓库中的信息来产生或校验 Java 存档 (JAR) 文件的数字签名
下面是命令行:
- keytool -genkey -keystore keystorename.keystore -keyalg RSA -validity 1000 -alias keystorename.keystore 回车
- Enter keystore password:输入你的密码 回车
- Re-enter new password:重复密码 回车
- What is your first and last name? 输入名字 回车
- What is the name of your organizational unit? 输入你的组织单位的名字 回车
- What is the name of your organization? 输入组织名称 回车
- What is the name of your City or Locality? 输入你所在城市的名字 回车
- What is the name of your State or Province? 输入你所在省份的名字 回车
- What is the two-letter country code for this unit? 输入国家的两字母代码(中国是CN)
- 确认信息:Y代表是,N代表否
- 最后再确认密码两遍,回车,证书就生成了
参数说明:
-genkey 产生证书文件
-keystore 指定密钥库的.keystore文件中
-keyalg 指定密钥的算法
-validity 为证书有效天数,这里我们写的是1000天。
-alias 产生别名
特别注意:
- 在输入密码时没有回显,只管输入就可以了,密码长度必须大于6位,切忌需要记下来后面还要用;
- CN(Common Name - 名字与姓氏):其实这个“名字与姓氏”应该是域名,比如说localhost或是blog.devep.net之类的。输成了姓名,和真正运行的时候域名不符,会出问题。浏览器访问时,弹出一个对话框,提示“安全证书上的名称无效,或者与站点名称不匹配”,用户选择继续还是可以浏览网页。但是用http client写程序访问的时候,会抛出类似于“javax.servlet.ServletException: HTTPS hostname wrong: should be ”的异常。
- 在用keytool生成数字证书时必须保证:-keystore androidapp.keystore -alias androidapp.keystore 两者名称必须相同。否则下一步签名时会出现错误:jarsigner: 找不到 androidapp.keystore 的证书链。androidapp.keystore 必须引用包含专用密钥和相应的公共密钥证书链的有效密钥库密钥条目。
三、用命令行为APK文件签名
首先,你必须先有一个未签名的APK和数字证书,未签名APK文件和证书生成方法上面已经介绍过,下面开始:
jarsigner -verbose -keystore my.keystore -signedjar Application_unsigned.apk Application_signed.apk my.keystore 回车
输入密钥口令
等待信息输出完成,在项目应目录下就能看到已签名的安装包了。