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 | |
|---|---|










