Android Studio怎么查看开发版或发布版证书的SHA1?

2017-02-28 16:00 598人阅读 暂无评论
版权声明:本文著作权归 TeachCourse所有,未经许可禁止转载,谢谢支持!
转载请注明出处: http://teachcourse.cn/how-to-query-signature-file-algorithm

摘要:

Android应用程序接入百度地图,创建应用程序怎么填写发布版SHA1和开发版SHA1?SHA1英文全称Secure Hash Algorithm,中文名称“安全哈希算法”,主要用于数字签名。Android应用程序签名证书获取SHA1字符串,根据开发工具的不同,签名证书有所区别,Eclipse获取开发版SHA1的方式比较稍微简单点,Android Studio获取发布版SHA1的方式会显的有点复杂,首先深入理解keytool.exe密钥和证书管理工具详细教程。

一、密钥和证书管理工具

密钥和证书管理工具keytool.exe位于JDK的bin文件夹,当前系统配置了JDK环境变量,直接命令行窗口输入keytool -help查看该工具命令帮助文档或者命令行窗口切换到bin路径再输入keytool -help,如下图:
keytool密钥、证书管理工具

根据上述帮助文档提示,使用keytool -command_name -help查看指定命令的用法,一个命令底下可能包含多个子命令,比如:keytool -certreq -help如下图:
keytool查看子命令
所有命令或选项用法如下:

  • 命令或选项前用-区分,比如:-certreq-changealias
  • 一个命令下的各个选项不区分先后顺序,比如:
    keytool -certreq -alias TeachCourse -sigalg des
    运行效果和下面命令一致:
    keytool -certreq -sigalg des -alias teachcourse
  • 括号后的选项如果不指定对应的数值,通常使用默认值(存在默认值),比如:-alias不指定参数TeachCourse,默认值为mykey
  • 括号后的选项如果用户不指定对应的数值,通常提示用户输入(不存在默认值),比如:-keypass不指定对应参数,执行失败后提示用户输入
  • 选项中的斜体部分为用户必须指定的数值或参数、路径,比如:
    keytool -printcert {-file cert_file} {-v}
    执行上述命令,cert_file使用真实的文件名代替,如下:
    keytool -printcert -file VSert.cer
  • 如果选项后包含空格,会被命令引用,比如:
    keytool -certreq -alias * -sigalg des
    ps:将*替换成空格

二、深入理解keytool命令用法

keytool.exe下的工具按照功能划分如下几个类型:

2.1 创建和添加数据到密钥库命令

  • -genkeypair {-alias alias} {-keyalg keyalg} {-keysize keysize} {-sigalg sigalg} [-dname dname] [-keypass keypass] {-validity valDays} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}

用于生成包含公钥和私钥的密钥对。将公钥封装到保存为单一单一认证链表的X.509 v3自签名证书中,这个认证链表和私钥保存在通过别名区分的新的实体中。

keyalg指定用于生成密钥对的算法,keysize指定生成密钥的长度,sigalg指定应该用于签名自签名证书的算法,这个算法必须是兼容keyalg

dname指定了与alias相关的X.500 Distinguished Name,被用作自签名证书的issuersubject字段,如果命令行没有指定Distinguished name,将提示输入。

keypass被用作保护生成密钥对的私钥,如果没有指定密码,将提示输入,然后这时按下回车键,密码被设置和密钥库的一样,同时keypass最少6个字符

valDays告知证书有效期长度

ps:在先前版本中,该命令为-genkey,旧版本的命令支持在新版本中使用,相反-genkeypair命令仅可以在当前或更高版本中使用

  • -genseckey{-alias alias} {-keyalg keyalg} {-keysize keysize} [-keypass keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}

生成密钥并存储到通过别名区分的KeyStore..SecretKeyEntry

keyalg指定了用于生成密钥的算法,keysize指定了生成密钥的长度,keypass为保护密钥的密码,如果没有设置密码,将提示输入,然后这时按下回车键,密码被设置和密钥库的一样,同时keypass最少6个字符

  • -importcert{-alias alias} {-file cert_file} [-keypass keypass] {-noprompt} {-trustcacerts} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}

keytool支持导入的证书类型X.509 v1,v2,v3证书或PKCS#7格式的证书链,导入的数据要么是二进制编码格式要么是打印流编码格式

ps:在先前版本中,该命令为-import,旧版本的命令支持在新版本中使用,相反-importcert命令仅可以在当前或更高版本中使用

  • -importkeystore-srckeystore srckeystore -destkeystore destkeystore {-srcstoretype srcstoretype} {-deststoretype deststoretype} [-srcstorepass srcstorepass] [-deststorepass deststorepass] {-srcprotected} {-destprotected} {-srcalias srcalias {-destalias destalias} [-srckeypass srckeypass] [-destkeypass destkeypass] } {-noprompt} {-srcProviderName src_provider_name} {-destProviderName dest_provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}

从密钥库导入一个或多个实体到另一个密钥库

指定srcalias参数,命令行导入的实体通过别名区分目标密钥库;如果没有通过destalias指定目标别名,srcalias被用作目标别名。源实体通过密码保护,srckeypass被用于恢复实体,如果srckeypass不指定,keytool将尝试使用srcstorepass恢复实体,如果srcstorepass没有提供或者提供错误,将提示用户输入密码。目标实体通过destkeypass保护,如果没有指定,目标实体将使用源实体的密码。

如果没有指定srcalias,在源密钥库的所有实体都被导入目标密钥库。每一个目标实体被存储对应的别名下,如果源实体通过密码保护,srcstorepass用于恢复实体。如果srcstorepass没有提供或者提供错误,将提示用户输入密码。如果目标密钥库不支持源实体类型或存入目标密钥库时出错,将提示用户是否继续或放弃,目标实体同样使用源实体密码保护。

如果目标别名已存在目标密钥库,将提示用户覆盖或创建别名不一样的新的实体。

ps:如果指定了-nopromt,将不会提示用户输入目标别名,已存在的实体将通过目标别名重写,最后,导入不了的实体将自动跳过并打印警告信息。

2.2 导出数据命令

  • -certreq{-alias alias} {-sigalg sigalg} {-file certreq_file} [-keypass keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}

使用PKCS#10格式生成签名请求的证书。

CSR将被发送到证书权威认证机构(CA),权威机构认证证书请求并反馈,将代替密钥库已存在的证书链。

与别名相关的私钥和X.500 Distinguished Name被用于创建PKCS#10证书请求,为了访问私钥,需要提供正确的密码,如果命令行没有指定keypass参数或指定的密码不正确,将提示用户输入。

sigalg指定了用于签名CSR的算法,如果CSR被保存在certreq_file文件中,同时没有指定该文件,CSR将以标准格式输出

  • -exportcert{-alias alias} {-file cert_file} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-rfc} {-v} {-protected} {-Jjavaoption}

读取与别名关联的证书并存储到指定cert_file文件中,如果文件没有指定,证书将以标准格式输出。

如果指定-rfc选项,证书默认以二进制编码输出或打印流编码格式

要么别名和已输出信任的证书关联,,否则将与密钥实体关联,如果是这样的话,将返回链表中通过别名认证公钥实体地址的第一个证书

ps:在先前版本中,该命令为-export,旧版本的命令支持在新版本中使用,相反-exportcert命令仅可以在当前或更高版本中使用

2.3 查询数据命令

  • -list{-alias alias} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v | -rfc} {-protected} {-Jjavaoption}

通过别名识别,以标准格式打印密钥库实体,如果没有指定别名,将打印密钥库所有实体。

该命令默认打印证书的MD5加密指纹,如果指定-v选项,将以便于人们阅读的格式打印,比如:拥有者,发行者,序列化等扩展信息;如果指定-rfc选项,将以打印流格式打印

  • -printcert{-file cert_file} {-v} {-Jjavaoption}

cert_file文件中读取证书并以便于人们阅读的格式打印,如果没有指定该文件,以默认格式打印。

ps:这个选项可以单独使用一个密钥库。

2.4 管理密钥库命令

  • -storepasswd[-new new_storepass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-Jjavaoption}

改变用于保护密钥库完整内容的密码,新密码至少6个字符长度

  • -keypasswd {-alias alias} [-keypass old_keypass] [-new new_keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-Jjavaoption}

改变通过别名保护的私钥密码,新密码和旧密码至少6个字符长。如果指定-keypass选项,密钥的密码不同于密钥库密码,否则提示用户输入;如果-new选项没有指定,将提示用户输入。

  • -delete[-alias alias] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}

通过别名删除密钥库实体,如果没有指定别名,将提示用户在命令行输入

  • -changealias{-alias alias} [-destalias destalias] [-keypass keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}

改变密钥库实体别名或目标实体别名,如果没有指定目标实体别名,在命令行中提示输入;如果源实体使用密码保护,必须提供-keypass选项提供;如果没有提供密钥密码,首先使用存储的密码,失败后提示用户输入。

2.5 帮助文档命令

  • -help

列出基础命令和对应选项

三、选项默认值

针对部分选项keytool.exe工具提供对应的默认值,如果没有指定选项后的参数值,将使用默认值代替,这部分选项包括:

选项命令 选项默认值
-alias "mykey"
-keyalg "DSA"(when using -genkeypair),"DES"(when using -genseckey)
-keysize "1024"(when using -genkeypair),"56"(when using -genseckey and -keyalg is "DES"),"168"(when using -genseckey and -keyalg is "DESede")
-validity 90
-keystore 指定用户根目录下以.keystore为后缀的文件名
-storetype 指定安全属性文件的属性值,通过in.java.security.KeyStore.getDefaultType()方法返回
-file 默认的读写操作
-protected false

四、例子理解keytool命令用法

4.1 生成密钥对命令:-genkeypair

keytool -genkeypair -dname "cn=huang, ou=guangzhou, o=guangzhou, c=CN" -alias zhaolin -keypass 123456 -keystore C:\working\mykeystore -storepass 123456 -validity 180

命令行创建密钥库实体,名称:mykeystore,保存位置:C:\working,标识密码:123456;生成的公钥和密钥对实体基本信息,姓名:huang,组织单位:guangzhou,组织:guangzhou,国家或地区代码:CN,默认算法:DAS,密钥长度:1024(参考选项默认值
keytool生成密钥对命令
上述命令使用默认的签名算法SHA1withDAS生成自签名证书,证书有限期180天,密钥库实体的私钥别名为zhaolin和私钥密码为123456

最简单的做法,使用keytool -genkeypair代替上面命令,如下图:
keytool生成密钥对命令

上面例子中,不指定-genkeypair选项对应的参数,将以默认格式创建密钥库实体。密钥库实体别名:mykey,秘钥对和证书的有限期:90天,实体.keystore文件存放路径:keytool工具根目录,提示输入身份信息以及密钥库密码、私钥密码,还是需要手动输入。

4.2 从证书权威机构请求签名证书

到目前为止,我们已经得到自签名证书,证书需要被更多第三方软件信任需要经过权威机构签发,这时需要生成一个证书签名请求(CSR),方法如下:
keytool -certreq -file Mark.csr

生成的CSR将请求保存在文件MarkJ.csr中,需要将该文件提交给CA,比如:VeriSign,CA将会认证提交的请求并返回由他们签发的证书,认证我们的公钥

 4.3 导入CA签发的证书

你需要在已认证公钥的证书链中替换自签名的证书,在你导入CA签发的证书前你需要信任密钥库一个或多个已存在的证书

  • 如果CA签发的是一个证书链,你需要拿取证书链中的首个证书
  • 如果CA签发的是单一的证书,你需要一个已发布的签名认证

CA的认证要么是自签名要么来自第三方的认证机构,假如:ABC公司是一个证书认证结构,你获得ABC结构支持的自签名证书,认证公钥。

如果信任的证书是有效的,可以将它添加到密钥库,如下:

keytool -importcert-alias abc -file ABCCA.cer

该命令在密钥库中创建信任的证书实体,证书来自ABCCA.cert,实体识别的别名为abc

4.4 导入来自CA认可的回复

假如,你将证书签名认证请求发给了VeriSign,你可以导入从该机构获得名称VSMarkJ.cer的证书,命令如下:

keytool -importcert -trustcacerts -file VSMarkJ.cer

4.5 导出证书认证的公钥

假如,你正在使用jarsigner工具签发JAR包,使用该文件的客户端将会认证你的签名。不管怎么样,你需要做的是导出你的公钥作为已信任的实体到对方的密钥库,你可以导出你的证书并提供给客户端,你可以通过命令将证书导出的名称为MJ.cert的文件中,命令如下:

keytool -exportcert -alias mykey -file MJ.cer

这时你需要将证书和JAR包文件一起发给客户端,客户端将使用jarsigner工具认证你的签名。

4.6 导出密钥库

importkeystore用于导出一个密钥库实体到另一个密钥库中,包含钥匙和证书。你可以使用该命令从不同类型的密钥库导出实体,在导出的时候,目标密钥库所有新实体拥有相同的别名和密码。如果keytool工具从源密钥库无法恢复私钥,将提示用户输入密码。如果检查发现别名重复,将要求你输入新的别名或让keytool工具重写已存在的别名。

例如,为了将所有实体从标准的JKS(key.jks)类型密钥库导入到基于硬件类型的PKCS#11密钥库,你可以使用下面命令:

keytool -importkeystore 
        -srckeystore key.jks -destkeystore NONE
        -srckeystore JKS -destkeystore PKCS11
        -srcstorepass changeit -deststorepass topsecret

importkeystore命令被用于从源密钥库导入到目标密钥库,既然这样,在上面的例子中,你还需要指定导入的别名,指定srcalias选项,同时你也可以在命令行中指定目标别名,为了保护私钥的密码,你可能指定keytool命令行不提示输入信息,在脚本中使用下面命令将非常方便:

keytool -importkeystore
        -srckeystore key.jks -destkeystore NONE
        -srcstoretype JKS -deststoretype PKCS11
        -srcstorepass changeit -deststorepass topsecret
        -srcalias myprivatekey -destalias myoldprivatekey
        -srckeypass oldkeypass -destkeypass mynewkeypass
        -noprompt

五、怎么查看jks类型文件的SHA1

怎么得到.jks类型的文件?如果你使用Android Studio开发工具,生成签名apk时,将导出以.jks为后缀的签名文件,导出填写的基本信息和生成密钥对命令的过程一样,可以肯定Android Studio导出.jks文件的过程,即生成秘钥对的过程。

查看jks类型文件的SHA1即查看默认签名算法的指纹,使用到查询数据命令(参考上面介绍),如下图:
Android Studio查看jks文件SHA1
如果指定-v选项,将以便于人们阅读的格式打印,比如:拥有者,发行者,序列化等扩展信息,如下图:
Android Studio私钥指纹

参考资料:
http://docs.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html
http://teachcourse.cn/2053.html

关注公众号 扫一扫二维码,加我QQ

如果文章对你有帮助,欢迎点击上方按钮关注作者

来源:TeachCourse每周一次,深入学习Android教程,关注(QQ1589359239或公众号TeachCourse)
转载请注明出处: http://teachcourse.cn/how-to-query-signature-file-algorithm
Android开发之混淆高级教程01 Android开发之混淆高级教程01
Eclipse导入另一台电脑下的Android项目style文件出现错误的原因 Eclipse导入另一台电脑下的And
调试微信官方Demo闪退的几个问题 调试微信官方Demo闪退的几个问题
Android事件分发流程分析证明(2) Android事件分发流程分析证明(

发表评论

呲牙 憨笑 坏笑 偷笑 色 微笑 抓狂 睡觉 酷 流汗 鼓掌 大哭 可怜 疑问 晕 惊讶 得意 尴尬 发怒 奋斗 衰 骷髅 啤酒 吃饭 礼物 强 弱 握手 OK NO 勾引 拳头 差劲 爱你

表情