一个签名文件包含证书和密钥,使用的是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 | |
---|---|