keytool常用命令

keyStore和truststore区别

我们自己的应用中通常所说的keystore或者truststore主要是针对于应用本身的需求来的。
keystore和truststore从其文件格式来看其实是一个东西,只是为了方便管理将其分开
keystore中一般保存的是我们的私钥,用来加解密或者为别人做签名
enter description here
truststore中保存的是一些可信任的证书,主要是java在代码中访问某个https的时候对被访问者进行认证的,以确保其实可信任的。truststore是必须的,如果我们没有显式的指定,那么java会默认指定为$JAVA_HOME/lib/security/cacerts 这个文件。
如果要指定的话,可以在java的参数中进行指定

1
2
3
4
-Djavax.net.ssl.keyStore=clientKeys   
-Djavax.net.ssl.keyStorePassword=password
-Djavax.net.ssl.trustStore=clientTrust
-Djavax.net.ssl.trustStorePassword=password

keystore可以看成一个放key的库,key就是公钥,私钥,数字签名等组成的一个信息。

truststore是放信任的证书的一个store。

truststore和keystore的性质是一样的,都是存放key的一个仓库,区别在于,truststore里存放的是只包含公钥的数字证书,代表了可以信任的证书,而keystore是包含私钥的。

Keytool常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
keytool密钥和证书管理工具

命令:

-certreq 生成证书请求
-changealias 更改条目的别名
-delete 删除条目
-exportcert 导出证书
-genkeypair 生成密钥对
-genseckey 生成密钥
-gencert 根据证书请求生成证书
-importcert 导入证书或证书链
-importpass 导入口令
-importkeystore 从其他密钥库导入一个或所有条目
-keypasswd 更改条目的密钥口令
-list 列出密钥库中的条目
-printcert 打印证书内容
-printcertreq 打印证书请求的内容
-printcrl 打印 CRL 文件的内容
-storepasswd 更改密钥库的存储口令

使用 "keytool -help" 获取所有可用命令
使用 "keytool -command_name -help" 获取 command_name 的用法

生成证书

生成jks格式的keystore

1
keytool -genkeypair -alias abc -keyalg RSA -keypass abc -keystore abc.jks -storepass abc -validity 3650

可以将jks格式的keystore转化成pfx格式
jks->p12

1
keytool -v -importkeystore -srckeystore abc.jks -srcstoretype jks -srcstorepass abc -destkeystore abc.pfx -deststoretype pkcs12 -deststorepass abc -destkeypass abc

p12->jks

1
keytool -importkeystore -srckeystore keystore.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore keystore.jks

将现有p12证书导入至jks格式的keystore中

1
2
3
keytool -importkeystore -destkeystore keystore.jks -srckeystore server.p12 -srcstoretype PKCS12 -alias 1 -storepass daniel
or
keytool -importkeystore -deststorepass changeit -destkeypass changeit -destkeystore bbb.jks -deststoretype jks -srckeystore aaa.jks -srcstoretype jks -srcstorepass changeit -alias tomcat

提取公钥

用keytool只能提取cert格式的公钥
从jks导出cert

1
2
3
keytool -list -rfc -keystore abc.jks -storepass abc
or
keytool -export -alias cert0001 -keystore trust.jks -storepass 123456 -file cert0001.cer

通过openssl可以提取PUBLIC KEY格式

1
2
通过通道符号把cert格式转成public key格式
keytool -list -rfc --keystore wood.jks | openssl x509 -inform pem -pubkey

导入公钥

将cert导入jks,生成truststore

1
keytool -import -v -alias cert001 -file cert001.cer -keystore trust.jks -storepass 123456 -noprompt

提取私钥

需要把证书先转成pfx格式
jks->p12

1
keytool -v -importkeystore -srckeystore abc.jks -srcstoretype jks -srcstorepass abc -destkeystore abc.pfx -deststoretype pkcs12 -deststorepass abc -destkeypass abc

利用p12提取私钥

1
openssl pkcs12 -in abc.pfx -nocerts -nodes -out abc.key

用keytool创建Keystore和Truststore文件

介绍

1.目的:JSSE使用Truststore和Keystore文件来提供客户端和服务器之间的安全数据传输。

2.描述:Keytool 是一个Java数据证书的管理工具 ,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中. 在keystore里,包含两种数据:密钥实体(Key entity)-密钥(secret key)或者是私钥和配对公钥(采用非对称加密);可信任的证书实体(trusted certificate entries)-只包含公钥.

即:keytool是一个工具可以用来创建包含公钥和密钥的的keystore文件,并且利用keystore文件来创建只包含公钥的truststore文件。

步骤

生成一个含有一个私钥的keystore文件

1
keytool -genkey -alias certificatekey  -keyalg RSA -validity 700  -keystore keystore.jks

说明:

  • genkey:在用户主目录中创建一个默认文件”.keystore”,还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书
  • alias:别名
  • keyalg:指定密钥的算法(如:RSA ,DSA 默认值为:DSA)
  • validity: 指定创建的证书有效期多少天(默认 90)
  • keystore: 指定密钥库的名称( 产生的各类信息将不在.keystore文件中,而是在keystore.jks中)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ keytool -genkey -alias certificatekey  -keyalg RSA -validity 700  -keystore keystore.jks

输入密钥库口令:*****
再次输入新口令:*****
您的名字与姓氏是什么?
[Unknown]: peng...
您的组织单位名称是什么?
[Unknown]: asia..
您的组织名称是什么?
[Unknown]: mall
您所在的城市或区域名称是什么?
[Unknown]: beijing
您所在的省/市/自治区名称是什么?
[Unknown]: beijing
该单位的双字母国家/地区代码是什么?
[Unknown]: ZG
CN=peng..., OU=..., O=mall, L=beijing, ST=beijing, C=ZG是否正确?
[否]: Y

输入 <certificatekey> 的密钥口令:****
(如果和密钥库口令相同, 按回车):
再次输入新口令:****
......

验证生成的keystore文件和证书信息

1
$ keytool -list -v -keystore keystore.jks -alias certificatekey
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ keytool -list -v -keystore keystore.jks
输入密钥库口令:****
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 1 个条目
别名: certificatekey
创建日期: 2015-11-25
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=peng.., OU=asiai.., O=mall, L=beijing, ST=beijing, C=ZG
发布者: CN=peng.., OU=asia.., O=mall, L=beijing, ST=beijing, C=ZG
序列号: 51c8a241
有效期开始日期: Wed Nov 25 15:37:07 CST 2015, 截止日期: Wed Oct 25 15:37:07 CST 2017
证书指纹:
MD5: 9B:A7:CC:B4:2B:E2:31:F0:7A:E0:36:..
SHA1: 4E:45:3A:A2:4F:B7:BA:84:0A:F2:CF:E....
SHA256: 5F:4B:8..
.....

从keystore.jks导出公钥证书

用keytool只能提取cert格式的公钥

1
2
3
$ keytool -export -alias  certificatekey -keystore keystore.jks -rfc -file gongyaoCert.cer
输入密钥库口令:*******
存储在文件 <gongyaoCert.cer> 中的证书

Truststore的生成以及公钥证书的导入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ keytool -import -alias certificatekey  -file gongyaoCert.cer  -keystore truststore.jks

输入密钥库口令:******
再次输入新口令:******

所有者: CN=peng.., OU=asia.., O=mall, L=beijing, ST=beijing, C=ZG
发布者: CN=peng..., OU=asi..., O=mall, L=beijing, ST=beijing, C=ZG

序列号: 51c8a24
有效期开始日期: Wed Nov 25 15:37:07 CST 2015, 截止日期: Wed Oct 25 15:37:07 CST 2017
证书指纹:
MD5: 9B:A7:CC:B4:2B:E2:31:F0:7A:E...
SHA1: 4E:45:3A:A2:4F:B7:BA:84:0A:F2....
SHA256: 5F:4B:8B:43:BA:A1:60:B0:3A:C5:71:CB:4E:C4:0A:B....
签名算法名称: SHA2...
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: ED 64 B3 D4 34 6E 84 28 ..... DB .d..4n.(!..uw/..
0010: 57 9D B6 44 W..D
]
]
是否信任此证书? [否]: y
证书已添加到密钥库中

验证公钥truststore.jks文件

1
$ keytool -list -v -keystore truststore.jks
--------------------本文结束,感谢您的阅读--------------------

本文标题:keytool常用命令

文章作者:弓昭

发布时间:2020年09月29日 - 15:06

最后更新:2021年04月21日 - 20:39

原始链接:https://gongzhao1.gitee.io/keytool常用命令/

联系邮箱:gongzhao1@foxmail.com