摘要:
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 -command_name -help
查看指定命令的用法,一个命令底下可能包含多个子命令,比如:keytool -certreq -help
如下图:
所有命令或选项用法如下:
- 命令或选项前用
-
区分,比如:-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,被用作自签名证书的issuer和subject字段,如果命令行没有指定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(参考选项默认值)
上述命令使用默认的签名算法SHA1withDAS生成自签名证书,证书有限期180天,密钥库实体的私钥别名为zhaolin和私钥密码为123456
最简单的做法,使用keytool -genkeypair
代替上面命令,如下图:
上面例子中,不指定-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即查看默认签名算法的指纹,使用到查询数据命令(参考上面介绍),如下图:
如果指定-v选项,将以便于人们阅读的格式打印,比如:拥有者,发行者,序列化等扩展信息,如下图:
参考资料:
http://docs.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html
https://www.teachcourse.cn/2053.html
当前文章价值6.96元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)
你可能感兴趣的文章
转载请注明出处: https://www.teachcourse.cn/how-to-query-signature-file-algorithm ,谢谢支持!