简述
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 都可以存储密钥对、证书、密钥。
实战
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