简单分析Android开发中的证书和密钥等问题

    作者:课课家教育更新于: 2016-04-06 10:51:01

        签名对于我们现实生活中是最平常不过的事了,但在虚拟的世界里就有点不可思议了,那要引言考虑到很多方面的问题,最主要的是安全性、可靠性等等,现在很多应用软硬件都有使用各种签名,那么现在我们谈谈有关Android开发中的签名证书与存在的问题。

      除了Android发布应用签名时需要用到证书外,在进行google Map Api开发和Facebook SDK API开发等时都需要申请API Key,在申请这些API Key的时候,也需要用到证书。

      使用Eclipse和ADT开发的时候,证书都是自动生成的,可以在Eclipse里Window->Preferneces -> Android -> Bulid Setting里看到如下图

      也即这个开发Debug用的证书在C:\\Users\\Haihua\\.android\\debug.keystore中,在这个页面我们还可以看到MD5和SHA1的指纹码,这个SHA1指纹码在google Map API Key申请时就需要使用的。

      假如单人开发应用一般无所谓,但是团队开发的时候,最好使用同一个debug.keystore,这样手机间切换,可以无缝安装,而且也可是使用同样的API KEY,免得每台机子编译时都需要去申请各自不同的API Key。但是必须使用默认的别名和密码(give alias name = androiddebugkey and password = android),否则添加自定义的证书会报失败。只有别名不对时,在上述对话框的黑体Build位置会提示如下报错

      当别名和密码都不对时,会报如下错误

      当然还会有一些其它的报错,诸如如下使用android studio的报错

      

      假设设置了自定义的证书后,就会如下图所示

      本以为用这个可视化工具可以查看release证书的SHA1等信息,但是由于它使用默认密码,所以也没有办法查看到。

      设置完自定义证书后,clean一下,然后重新编译运行就使用自定义证书了。我将打包的apk文件,重命名为zip或rar之后,解压缩,然后在解压的\\META-INF\\CERT.RSA文件就是签名的证书,对这个证书使用KeyTool如下操作

      keytool -printcert –file \\META-INF\\CERT.RSA

      就会拿到这个证书的一个详细信息,下面截图有两个证书,前一个是自动生成的证书,后一个是我试验做的一个证书。具体如下所示

      如何生成证书

      命令行生成证书

      生成证书使用的是JDK附带的一个Keytool工具,像上面一样在cmd中使用时,需要将相关的路径设置到环境变量中,比如我本地的路径名为C:\\Program Files\\Java\\jdk1.8.0_05\\bin,就要将其加到Windows的环境变量中。

      上述生成debug的证书可以使用如下命令

      keytool -genkey -alias androiddebugkey -keyalg RSA -keysize 1024 -keypass android -validity 365 -keystore c:\\test\\mozatdev.keystore -storepass android

      至于具体的生成证书和Keytool工具可以看下如下链接:

      可视化生成证书

      上述是使用命令行方式来生成证书,那么有没有可视化的生成证书方式呢?

      目前我知道可以使用Eclipse的ADT工具,即右键单击项目名称,选择"Android Tools"->"Export Signed Application Package..."(输出签名的应用程序包)

      有时候工程中有些Lint Error,点击是会弹出如下对话框

      这个时候我们可以先忽略掉错误检查,具体如下图所示,设置好之后,需要Clean一下再重新调用上述发布包的工具,否则还是没办法进行下一步。

      下一步就给一个创建Key的截图吧

      具体创建的过程可以参考网上的《android_apk安装包的制作过程图解》

      上述可视化方法的缺点就是必须要真的打一次包才能生成证书。

      如何申请google map V2 Api KEY

      关于这一步网上有一个很专门的帖子,这里先不做展开,照着做就行了,目前为上面的mozatdev.keystore申请了如下两个API Key

      具体参考链接

      繁体版本(内含一个完整的goole map开发)

      

     

         在这里不做google map api的使用,这个还来不及做整理。

      如何申请Facebook API Key

      上面google map API Key的申请使用的是SHA1指纹,在申请Facebook SDK API时使用的相对来说复杂一点,因为他需要用到的KeyHash,具体命令类似如下:

      keytool -exportcert -alias androiddebugkey -keystore C:\\Users\\Haihua\\.android\\debug.keystore | C:\\OpenSSL\\bin\\openssl sha1 -binary | C:\\OpenSSL\\bin\\openssl base64

      运行结果类似如下,当密码输出的情况下生成的hash是一样的,直接用回车和输入正确密码时,结果也是一样的,两者的区别就是前者不能用,后者能用,至于为啥一样,跟算法有关,我也没去细究。

      除了上面提到的keytool工具外,还需要安装一个openSSL,具体可以从如下链接下载一个安装包

      当然如果不想这么麻烦安装这些工具的话,也可以用下面链接中的代码方式获取hash,只是我没有尝试过。

      详情还可以参考Facebook相关官网

      在这里也来不及做相关API使用的具体介绍,只是简单介绍下申请API Key。

      通过上面两个具体API Key的申请,想必对Android的证书会有一个比较直观的了解了。

      小结一些命令

      下面再单独将上述用到的几个cmd命令抽出来一下

      生成证书的命令

      keytool -genkey -alias androiddebugkey -keyalg RSA -keysize 1024 -keypass android -validity 365 -keystore c:\\test\\mozatdev.keystore -storepass android

      查看证书详情的命令

      keytool -list -v -keystore C:\\Users\\Haihua\\.android\\debug.keystore -alias androiddebugkey -storepass android -keypass android

      如何查看apk已签名的证书详情。由于在apk安装时我也不知道怎么查看,只知道采取apk重命名后解压缩,拿到\\META-INF\\CERT.RSA文件,然后执行如下命令查看。

      keytool -printcert -file c:\\test\\ShellShabikDev\\cert.rsa

      网上还有一种方法,用jarsigner来查看,但是这会查看所有的文件,而且看不到SHA1等指纹,具体命令

      jarsigner -verify -verbose -certs ShellShabik.rar

      具体显示

      sm 3122 Mon Aug 25 15:51:26 SGT 2014 res/drawable-xxhdpi/common_signin_btn_text_pressed_dark.9.png

      X.509, CN=FrankSun, OU=mozat.com, O=mozat, L=Singapore, ST=singapore, C=sg

      [certificate is valid from 23/08/14 下午 10:07 to 23/08/15 下午 10:07]

      [CertPath not validated: Path does not chain with any of the trust anchors]

      导出证书的相关命令

      keytool -exportcert -alias androiddebugkey -keystore C:\\Users\\Haihua\\.android\\debug.keystore | C:\\OpenSSL\\bin\\openssl sha1 -binary | C:\\OpenSSL\\bin\\openssl base64

         本文主要讲了命令生成证书与可视化生成证书,还有一些网上证书的参考资料,还有一些命令的执行代码,这些知识都有些繁琐,记起来也没那么简单,但主要是理解,理解透了自然就会了。

安卓 更多推荐

课课家教育

未登录