之前生成签名时,都是在Android Studio里点,点几下一个签名就出来了,作为一个开发者,学会使用keytool工具,手动进行一些签名相关的操作,如生成、查看、导出等,还是很能提供很多方便的。
java key store的管理方式为,签名一个应用需要一个key,一个key存在于一个keystore中,一个keystore中可以存在多个key。keystore拥有密码,同时,key也拥有密码。二者之间的关系可以这样理解,keystore相当于一个大房子,key则相当于房子里的一个房间,房子里可以有多个房间,进入房子需要钥匙,也就是密码,再想进入到某个房间,也需要这个房间的钥匙,也就是密码。不过,话说回来,一般常用的方式,都是一对一的形式,也就是一个keystore只存储一个key,这个key只用来签名一个应用,没有将keystore中的store的价值体现出来。
1. 支持的命令
keytool提供了很多的命令,通过help可以查看,其中,常用的只有生成、查看、导入导出,其他的就不说了
1 | $ keytool help |
2. 生成
使用genkeypair命令
1 | keytool -genkeypair -alias key0 -keypass 123456 -keystore test.jks -storepass 1234 -keyalg RSA -validity 2000 -keysize 2048 -dname "CN=abc,OU=def" |
参数说明
- alias:给key起个名字,一个keystore中key的名字不允许重复
- keypass: 给key设置一个密码
- keystore:生成的key要存放的目标keystore,如果不存在则会创建
- storepass:keystore的密码,访问keystore就需要密码
- keyalg:生成使用的算法,默认是DSA,常用RSA
- validity:key的有效期,单位是天
- keysize:key的长度,RSA2048,DSA2014,EC256,DES56,AES128
- dname:key的详细信息,完整的是:CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名称,ST=州或省份名称,C=单位
3. 查看
使用list命令,这个命令会把keystore中所包含的所有key都展示出来
1 | keytool -list -keystore test.jks -storepass 123456 -v |
参数说明
- keystore:要查看的keystore
- storepass:keystore的密码
- v:verbose 展示所有信息
- rfc:以rfc的格式展示,和-v不能同时使用
4. 导出
使用exportcert命令,导出的是一个证书文件,也就是key
1 | keytool -exportcert -alias key0 -keystore test.jks -storepass 123456 -file key0.crt |
参数说明
- alias:要导出的key的名字
- keystore:同上
- storepass:同上
- file:导出的文件
5. 导入
使用importcert命令,将一个crt文件,也就是key,导入到keystore中
1 | keytool -importcert -alias key0 -keypass 123456 -file key.crt -keystore test.jks -storepass 123456 |
参数说明
- alias:给导入的key起个名字,不能和已存在的重复
- keypass:给导入的key设置个密码
- file:待导入的key的证书
- keystore:目标keystore
- storepass:密码
其他
genkeypair适用非对称加密,包括私钥和公钥。genseckey适用于对称加密,只有一个密钥。jks文件只能存储非对称加密。