关于Android开发中的证书和密钥等问题
关于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工具可以看下如下链接:
java keytool证书工具使用小结 http://www.micmiu.com/lang/java/keytool-start-guide/
Android签名机制:生成keystore、签名、查看签名信息
http://www.ourunix.org/post/146.html
可视化生成证书
上述是使用命令行方式来生成证书,那么有没有可视化的生成证书方式呢?
目前我知道可以使用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开发)
http://www.moke.tw/wordpress/computer/advanced/410 (推荐看这个,下面这个图片太小了)
http://cheng-min-i-taiwan.blogspot.sg/2013/04/google-maps-android-api-v2-android.html
在这里不做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相关官网
官网文档
https://developers.facebook.com/docs/android/getting-started/
一个比较老的中文翻译
http://www.cnblogs.com/tianjian/archive/2012/03/21/2410633.html
一个繁体版本的链接(我觉得挺有用的)
http://androchen.logdown.com/posts/2014/01/26/android-facebook-sdk-release-key-hash
在这里也来不及做相关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
关于Android开发中的证书和密钥等问题的更多相关文章
- Android学习探索之Java 8 在Android 开发中的应用
前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上, ...
- android开发中fragment获取context
在用到fragment时无法使用.this来指定当前context内容,android开发中fragment获取context,可以使用getActivity().getApplicationCont ...
- java中的反射机制在Android开发中的用处
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...
- Android开发中的输入合法性检验
Why ? 合法性检查对于程序的健壮性具有重要作用.在Android开发中,良好的合法性检查设计机制可以使程序更加清晰,产生bug更少,交互更加友好. What ? 合法性检查的目的在于确定边界.对于 ...
- 在android开发中使用multdex的方法-IT蓝豹为你整理
Android系统在安装应用时,往往需要优化Dex,而由于处理工具DexOpt对id数目的限制,导致其处理的数目不能超过65536个,因此在Android开发中,需要使用到MultiDex来解决这个问 ...
- 怎样实现了捕获应用中的日志在android开发中
怎样实现了捕获应用中的日志在android开发中,大家可研究一下. Process mLogcatProc = null; BufferedReader reader = null; try { mL ...
- Android开发中Eclispe相关问题及相应解决(持续更新)
1.Eclipse项目中的Android Private Libraries没有自动生成. 一般而言,在Android开发中,项目中引用到的jar包会放到项目目录中的libs中,引入库会放到Andro ...
- Android开发中的问题及相应解决(持续更新)
最近博客写的少了,以后还得经常更新才行. ------------------------------------------------------------ 1.特定业务需求下try cath ...
- Android开发中Bundle用法包裹数据(转)
Android开发中Bundle用法包裹数据 Bundle的经典用法,包裹数据放入Intent中,目的在于传输数据. SDK 里是这样描述: A mapping from String values ...
随机推荐
- 可选择Email和用户名登录的代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [Socket网络编程]一个封锁操作被对 WSACancelBlockingCall 的调用中断。
原文地址:http://www.cnblogs.com/xiwang/archive/2012/10/25/2740114.html记录在此,方便查阅. C#中在使用UDPClient循环监听端口,在 ...
- java笔记--反射进阶之总结与详解
一.反射进阶之动态设置类的私有域 "封装"是Java的三大特性之一,为了能更好保证其封装性,我们往往需要将域设置成私有的, 然后通过提供相对应的set和get方法来操作这个域.但是 ...
- VS2010 使用时选择代码或双击时出错,点击窗口按钮后VS自动重启问题
VS2010 使用时选择代码或双击时出错崩溃,点击窗口按钮后VS自动重启问题 下载补丁,打上补丁之后,重启电脑,解决了问题. WindowsXP的下载地址:Windows XP 更新程序 (KB971 ...
- Toast工具类,Android中不用再每次都写烦人的Toast了
package com.zhanggeng.contact.tools; /** * Toasttool can make you use Toast more easy ; * * @author ...
- iOS UILabel圆角
对于UIView 直接设置 uiview.layer.cornerRadius = 5 就可以有圆角了 但是对于UILabel则不然, 要多设置一个uilabel.clipsToBounds = YE ...
- C语言可以包含.txt文件
// fa.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h"#include "iostream"#include" ...
- 基于贪心算法的几类区间覆盖问题 nyoj 12喷水装置(二) nyoj 14会场安排问题
1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2,6],[1, ...
- 【Spring】Spring系列2之bean的配置
2.bean的配置 2.1.IOC概述 2.2.bean的获取 2.3.依赖注入方式 2.4.属性注入细节 内部bean,不需要ID,ID无效,外部不能引用: 2.5.集合属性注入 2.6.使用p命名 ...
- Convert Sorted List to Balanced BST
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...