当前位置: 首页 > 工具软件 > x-KeyTool > 使用案例 >

Keytool 工具使用

姚海
2023-12-01

keytool 是jdk提供的秘钥和证书管理工具,可以查看签名信息。管理加密密钥、X.509 证书链和可信证书的密钥库(数据库)

基础知识:

一个签名文件包含证书和密钥,使用的是RSA非对称加密方式,证书其实就是公钥,公钥的生成需要私钥。
密钥库类型有(PKCS12、jks等),(-v 和 -rfc 不能一起用,这两个是区分输出内容的格式)
官方地址:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/keytool.html

生成密钥对(生成秘钥和证书,也就是签名文件)

作为安卓开发者用keytool 最多的就是生成签名文件了。
生成密钥对(生成秘钥和证书,也就是签名文件)
-genkeypair

选项:
 -alias <alias>                  要处理的条目的别名
 -keyalg <keyalg>                密钥算法名称(RSA)
 -keysize <keysize>              密钥位大小(字节)
 -groupname <name>               Group name. For example, an Elliptic Curve name.
 -sigalg <sigalg>                签名算法名称(RSA\DSA)
 -storetype <storetype>          密钥库类型(PKCS12、jks,默认jks)
 -destalias <destalias>          目标别名(和上面的别名一样即可)
 -dname <dname>                  唯一判别名(如果没配置,输入命令时会提示输入相关信息,随便填就好了)
 -startdate <startdate>          证书有效期开始日期/时间(使用默认的即可)
 -validity <valDays>             有效天数
 -keypass <arg>                  密钥口令(别名密码)
 -keystore <keystore>            密钥库名称
 -storepass <arg>                密钥库口令
 -v                              详细输出

生成秘钥对(签名文件或者说RSA非对称加密方式)
-dname “CN=(名字与姓氏), OU=(组织单位名称), O=(组织名称), L=(城市或区域名称), ST=(州或省份名称), C=(单位的两字母国家代码)”;
实例:

keytool -genkeypair -v -keysize 2048 -dname “C=CN,ST=GD,L=SZ,O=GZ,OU=dev,CN=guangzhou.com” -alias signtest4 -keyalg RSA -validity 36500 -destalias signtest4 -keypass a123456 -keystore ./signtest4.jks -storepass a123456

会有下面提示,可以忽略,也可以在上面的命令中指定秘钥库类型-storetype:
JKS 密钥库使用专用格式。建议使用 “keytool -importkeystore -srckeystore ./signtest4.keystore -destkeystore ./signtest4.keystore -deststoretype pkcs12” 迁移到行业标准格式 PKCS12。
实例:

keytool -genkeypair -v -storetype PKCS12 -keysize 2048 -dname “C=CN,ST=GD,L=SZ,O=GZ,OU=dev,CN=guangzhou.com” -alias signtest4 -keyalg RSA -validity 36500 -destalias signtest4 -keypass a123456 -keystore ./signtest4.jks -storepass a123456

生成密钥(对称加密方式)
-genseckey

选项:
 -alias <alias>                  要处理的条目的别名
 -keypass <arg>                  密钥口令
 -keyalg <keyalg>                密钥算法名称(不能是非对称算法RSA,可以是AES\DES)
 -keysize <keysize>              密钥位大小(一定等于128 192还是256)
 -keystore <keystore>            密钥库名称
 -storepass <arg>                密钥库口令
 -storetype <storetype>          密钥库类型(PKCS12、jks)
 -v                              详细输出

生成秘钥(对称加密)
实例:

keytool -genseckey -v -storetype PKCS12 -alias signtest5 -keypass 123456 -keyalg AES -keysize 256 -keystore ./signtest5.jks -storepass 123456
keytool -genseckey -v -storetype PKCS12 -alias signtest5 -keypass 123456 -keyalg DES -keysize 56 -keystore ./signtest5.jks -storepass 123456

问题:
java.security.KeyStoreException: Cannot store non-PrivateKeys
需要指定密钥类型

列出密钥库中的条目(秘钥详细信息)
-list

选项(只列出实用的,其他信息都会在信息打印中默认显示):
-rfc 以 RFC 样式输出
-alias 要处理的条目的别名
-keystore 密钥库名称
-storepass 密钥库口令
-v 详细输出

通过签名文件(.jks/.keystore)可以查看证书串内容

keytool -list -rfc -keystore ./signtest3.keystore -storepass a123456

通过签名文件(.jks/.keystore)可以查看签名的sha1、sha256、MD5(jdk版本较高的情况,会无法显示md5值,1.8.0_219 以上不行,因为jdk在高版本去掉了Disable MD5 or MD2 signed jars)

keytool -list -v -keystore ./signtest3.keystore -storepass a123456

更改密钥库的存储口令
-storepasswd

选项:
-new 新口令
-keystore 密钥库名称
-storepass 密钥库口令
-v 详细输出

更改密钥密码

keytool -storepasswd -v -keystore ./signtest3.keystore -storepass a123456 -new 123456

更改别名的密钥口令(更改别名alias密码)
-keypasswd

选项:
-alias 要处理的条目的别名
-keypass 密钥口令(别名alias原密码)
-new 新口令
-keystore 密钥库名称
-storepass 密钥库口令
-v 详细输出

更改别名密码

keytool -keypasswd -v -alias signtest2 -keypass a123456 -new 123456 -keystore ./signtest3.keystore -storepass a123456

更改别名的名称(参考上面的命令)
-changealias
删除别名(参考上面的命令)
-delete

生成证书请求(少用)
-certreq

选项:
-alias 要处理的条目的别名(别名)
-sigalg 签名算法名称(SHA256withRSA)
-file 输出文件名
-keypass 密钥口令(别名密码)
-keystore 密钥库名称
-storepass 密钥库口令(签名文件密码)
-storetype 密钥库类型(PKCS12、jks)
-v 详细输出

根据签名文件生成证书请求(需要使用RSA生成的秘钥来导出)

keytool -certreq -v -alias signtest2 -sigalg SHA256withRSA -file mycert.cer -keypass a123456 -keystore ./signtest3.keystore -storepass a123456

打印证书请求的内容
-printcertreq

选项:
-rfc 以 RFC 样式输出
-file 输入文件名
-v 详细输出

打印证书请求内容

keytool -printcertreq -rfc -file mycert.cer

打印证书请求内容(输出结果和上面一样)

keytool -printcertreq -v -file mycert.cer

根据证书请求来生成证书
-gencert

选项:
 -rfc                            以 RFC 样式输出
 -infile <filename>              输入文件名
 -outfile <filename>             输出文件名
 -alias <alias>                  要处理的条目的别名
 -sigalg <sigalg>                签名算法名称
 -dname <dname>                  唯一判别名
 -startdate <startdate>          证书有效期开始日期/时间
 -ext <value>                    X.509 扩展
 -validity <valDays>             有效天数
 -keypass <arg>                  密钥口令(别名的密码)
 -keystore <keystore>            密钥库名称
 -storepass <arg>                密钥库口令(签名文件的密码)
 -v                              详细输出

根据证书请求生成证书(时间格式不清楚,所以不加开始时间的配置,默认当前时间)

keytool -gencert -rfc -infile mycert.cer -outfile mycert3.cer -alias signtest2 -sigalg SHA256withRSA -validity 36500 -keypass a123456 -keystore ./signtest3.keystore -storepass a123456
keytool -gencert -rfc -infile mycert.cer -outfile mycert3.cer -alias signtest5 -sigalg SHA256withAES -validity 36500 -keypass 123456 -keystore ./signtest5.jks -storepass 123456

根据签名文件导出证书
-exportcert

选项:
-rfc 以 RFC 样式输出
-alias 要处理的条目的别名
-file 输出文件名
-keystore 密钥库名称
-storepass 密钥库口令
-v 详细输出

根据签名文件导出证书文件(和根据-list 的-rfc直接打印签名信息看到)结果是一样的

keytool -exportcert -rfc -alias signtest2 -file mycert2.cer -keystore ./signtest3.keystore -storepass a123456

打印证书内容
-printcert

选项
-rfc 以 RFC 样式输出
-file 输入文件名
-sslserver <server[:port]> SSL 服务器主机和端口
-jarfile 已签名的 jar 文件
-v 详细输出

通过证书文件(.RSA)查看证书

keytool -printcert -rfc -file SIGNTEST.RSA

通过证书文件(.RSA)可以查看签名的sha1、sha256、MD5(jdk版本较高的情况,会无法显示md5值)

keytool -printcert -v -file SIGNTEST.RSA
 类似资料: