What is the purpose of keystore
简述
KeyStore是一个存储库,可用于存储一系列密钥(Secret Key)、密钥对(Key Pair)或证书(Certificate)。
密钥:只有一个钥,一般是对称加密时使用。
密钥对:包含公钥(Public Key)和私钥(Private Key),一般是非对称加密时使用。
- KeyStore可以设置密码。
- 密钥、密钥对、证书在KeyStore统称为Key(又称"条目"),每一个Key通过alias(别名)区分。Key也可以设置密码。
- KeyStore可以理解为一种规范,常见的 JKS(Java Key Store)只是KeyStore的一种实现类型,其他的还有PKCS12、JCEKS等。
- JKS 可以存储密钥对和证书,但不能用于存储密钥。
- PKCS12、JCEKS 都可以存储密钥对、证书、密钥。
题外话:将KeyStore类比为数据库,它可以设置密码;
那么Key就是表,alias也就是表名,密钥、密钥对、证书对应不同的表结构,密钥’表’只有一个字段,密钥对’表’有两个字段,存公钥和私钥,证书’表’同理,Key也可以设置密码。
设置密码的比喻有点勉强啊,理解意思就行哈。
实战
JDK提供了 keytool
命令,用于管理该存储库。
$ keytool
密钥和证书管理工具
命令:
-certreq 生成证书请求
-changealias 更改条目的别名
-delete 删除条目
-exportcert 导出证书
-genkeypair 生成密钥对
-genseckey 生成密钥
-gencert 根据证书请求生成证书
-importcert 导入证书或证书链
-importpass 导入口令
-importkeystore 从其他密钥库导入一个或所有条目
-keypasswd 更改条目的密钥口令
-list 列出密钥库中的条目
-printcert 打印证书内容
-printcertreq 打印证书请求的内容
-printcrl 打印 CRL 文件的内容
-storepasswd 更改密钥库的存储口令
使用 “keytool -command_name -help” 获取 command_name 的用法
生成密钥对
- 查看帮助
keytool -genkeypair -help
-storetype
:指定KeyStore的实现类型(JKS(默认)、JCEKS、PKCS12)-keystore
:指定KeyStore(存储库)名称(可包含路径)-storepass
:指定KeyStore的密码-alias
:指定Key的别名-keypass
:指定Key的密码-keysize
:指定Key的位大小-keyalg
:指定Key的加密算法名称-validity
:指定有效天数
- 生成密钥对
keytool -genkeypair -keystore my.keystore -storepass 123456 -alias my-key -keypass 654321 -keysize 1024 -keyalg RSA -validity 365
执行该命令,根据提示输入相关信息,就会往存储库中添加密钥对。(若存储库文件不存在,会自动创建)
查看存储库文件的明细(有多少Key)
keytool -list -keystore my.keystore -storepass 123456
-v 输出详情
-rfc 以 RFC 样式输出
查看密钥对中的公钥
(实际上密钥对中公钥是以证书的形式存放的,即密钥对->证书->公钥)
keytool -list -rfc --keystore my.keystore -storepass 123456 -alias my-key | openssl x509 -inform pem -pubkey
(openssl 命令需要在 git bash 执行)
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCWUmrLbxhCiDB1Af1FyL3wPrSm
V9MYjLexx5dtPKWbwhv8aTvJT1bnsrFtepVLm0KcMjqA7sZdJNfolh9nXNUYqQU5
oFFkLjLyPjY5qwXNrbLms6MtEMKjH85GvMgLZjAsuwiqosqi/TpClG0b3ftXPByD
M4UBnOsVHFc3b2HKtQIDAQAB
-----END PUBLIC KEY-----
导出证书
keytool -export -keystore my.keystore -storepass 123456 -alias my-key -file my.cert
打印证书
keytool -printcert -rfc -file my.cert
查看证书中的公钥
keytool -printcert -rfc -file my.cert | openssl x509 -inform pem -pubkey