证书学习(一)keytool 工具使用介绍

目录

    • [一、keytool 简介](#一、keytool 简介)
      • [1.1 什么是 keytool?](#1.1 什么是 keytool?)
      • [1.2 主要功能:](#1.2 主要功能:)
      • [1.3 使用场景](#1.3 使用场景)
      • [1.4 常用命令](#1.4 常用命令)
      • [1.5 默认参数](#1.5 默认参数)
    • [二、keytool 用法说明](#二、keytool 用法说明)
      • [2.1 基本使用](#2.1 基本使用)
      • [2.2 创建密钥库和密钥条目](#2.2 创建密钥库和密钥条目)
      • [2.3 查看密钥库信息](#2.3 查看密钥库信息)
      • [2.4 导出密钥库条目证书](#2.4 导出密钥库条目证书)
      • [2.5 导入信任证书到密钥库](#2.5 导入信任证书到密钥库)
      • [2.6 打印证书内容](#2.6 打印证书内容)
      • [2.7 删除密钥库条目](#2.7 删除密钥库条目)
      • [2.8 证书签发与导入](#2.8 证书签发与导入)
        • [第一步:-genkeypair 命令,创建 `test.keystore` 密钥库](#第一步:-genkeypair 命令,创建 test.keystore 密钥库)
        • [第二步:-certreq 命令,生成证书签名请求文件CSR](#第二步:-certreq 命令,生成证书签名请求文件CSR)
        • [第三步:-gencert 命令,签发证书](#第三步:-gencert 命令,签发证书)
        • [第四步:-importcert 命令,导入签发证书到密钥库](#第四步:-importcert 命令,导入签发证书到密钥库)
          • [1)导出 test.keystore 的信任证书:](#1)导出 test.keystore 的信任证书:)
          • [2)将信任证书 test.crt 以其别名 "test" 导入到密钥库 bo.keystore 中:](#2)将信任证书 test.crt 以其别名 “test” 导入到密钥库 bo.keystore 中:)
          • [3)将签发证书 test_to_bo.crt 以别名 "www.bo.org" 导入到密钥库 bo.keystore:](#3)将签发证书 test_to_bo.crt 以别名 “www.bo.org” 导入到密钥库 bo.keystore:)
          • 4)验证证书导入结果:
          • 5)验证结果:
    • 三、补充
      • [3.1 导出 .p12/.pfx 文件](#3.1 导出 .p12/.pfx 文件)
      • [3.2 -importkeystore 命令](#3.2 -importkeystore 命令)
    • 四、总结

一、keytool 简介

1.1 什么是 keytool?

keytool 是 Java 开发工具包 JDK1.4 之后引入的一个命令行工具,用于管理和生成 密钥对数字证书 以及管理 密钥库。它主要用于安全通信和身份验证,通过使用公钥/私钥对和相关证书实现自我认证。

keytool 将密钥和证书存储在所谓的 "密钥库" 中,这是一种安全的存储设施,可以保护敏感信息免受未经授权的访问。

keytool 命令位置:

shell 复制代码
%JAVA_HOME%\bin\keytool.exe

1.2 主要功能:

  1. 生成密钥对: 可以创建新的公钥和私钥对,并将其存储在指定的密钥库。
  2. 生成证书请求(CSR): 可以生成证书签名请求(Certificate Signing Request),并将其提交给CA(证书办法机构)进行签发。
  3. 导入和导出证书: 可以从密钥库中导入或导出证书,支持多种格式。
  4. 查看和操作密钥库: 可以列出密钥库中的所有条目,包括公钥、私钥和证书链等信息。
  5. 转换密钥库格式: 可以将密钥库从一种格式转换为另一种格式,例如从 PKCS12 转换为 Jks
  6. 自签名证书: 可以创建自签名的证书,用于测试和开发环境中的安全通信。
  7. 证书吊销列表文件: 可以生成证书吊销列表文件,用于跟踪已撤销的证书。

1.3 使用场景

keytool 广泛应用于各种需要证书签名和身份验证的场景,如:

  • SSL/TLS 配置安全电子邮件Web服务 等等。

它可以帮助开发者轻松管理证书和密钥,确保系统的安全性。

1.4 常用命令

使用 keytool 生成自签名证书:

  • 带解释命令:
shell 复制代码
keytool -genkey -alias test(别名) 
-keypass 123123(私钥密码) 
-keyalg RSA(算法) 
-sigalg sha256withrsa(算法小类) 
-keysize 1024(密钥长度) 
-validity 365(有效期)
-keystore d:/keystore/test.jks(生成路径) 
-storepass 123123(主密码)
  • 生成 jks 文件,原始命令:
shell 复制代码
keytool -genkey -alias test -keypass 123123 -keyalg RSA -sigalg sha256withrsa -keysize 1024 -validity 365 -keystore d:/keystore/test.jks -storepass 123123
  • 生成 p12 文件,原始命令:
shell 复制代码
keytool -genkey -alias 别名 -keypass 密码 -keyalg RSA -keysize 2048 -validity 365 -keystore  文件路径/文件名.p12 -storepass 密码 -deststoretype pkcs12

1.5 默认参数

keytool 命令的默认参数如下:

shell 复制代码
-alias "mykey"
 
-keyalg
    "DSA" (when using -genkeypair)
    "DES" (when using -genseckey)
 
-keysize
    2048 (when using -genkeypair and -keyalg is "RSA")
    2048 (when using -genkeypair and -keyalg is "DSA")
    256 (when using -genkeypair and -keyalg is "EC")
    56 (when using -genseckey and -keyalg is "DES")
    168 (when using -genseckey and -keyalg is "DESede")
 
-validity 90
  
-keystore <the file named .keystore in the user's home directory>

-destkeystore <the file named .keystore in the user's home directory>
   
 -storetype <the value of the "keystore.type" property in the
    security properties file, which is returned by the static
    getDefaultType method in java.security.KeyStore>
 
-file
    stdin (if reading)
    stdout (if writing)
 
-protected false

二、keytool 用法说明

2.1 基本使用

keytool 的语法如下:

  • keytool [选项]

选项如下:

shell 复制代码
 -gencert            根据证书请求生成证书
 -genkeypair         生成密钥对(简写-genkey)
 -genseckey          生成密钥
 -importcert         导入证书或证书链
 -importpass         导入口令
 -importkeystore     从其他密钥库导入一个或所有条目

 -certreq            生成证书请求
 -exportcert         导出证书
 -list               列出密钥库中的条目
 -printcertreq       打印证书请求的内容
 -printcert          打印证书内容
 -printcrl           打印 CRL 文件的内容

 -storepasswd        更改密钥库的存储口令(简写-storepass)
 -keypasswd          更改条目的密钥口令
 -delete             删除条目
 -changealias        更改条目的别名
 -help               帮助

使用 "keytool -command_name -help" 获取 command_name 的用法

想要了解某个命令的参数可以使用 keytool -command_name -help 来查看具体用法。例如:

  • keytool -genkeypair -help:可以查看 genkeypair 命令的参数说明:
shell 复制代码
D:\test>keytool -genkeypair -help
keytool -genkeypair [OPTION]...

生成密钥对

选项:

 -alias <alias>                  要处理的条目的别名
 -keyalg <keyalg>                密钥算法名称
 -keysize <keysize>              密钥位大小
 -sigalg <sigalg>                签名算法名称
 -destalias <destalias>          目标别名
 -dname <dname>                  唯一判别名
 -startdate <startdate>          证书有效期开始日期/时间
 -ext <value>                    X.509 扩展
 -validity <valDays>             有效天数
 -keypass <arg>                  密钥口令
 -keystore <keystore>            密钥库名称
 -storepass <arg>                密钥库口令
 -storetype <storetype>          密钥库类型
 -providername <providername>    提供方名称
 -providerclass <providerclass>  提供方类名
 -providerarg <arg>              提供方参数
 -providerpath <pathlist>        提供方类路径
 -v                              详细输出
 -protected                      通过受保护的机制的口令

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

keytool 有许多命令使用的参数是有默认值的,使用命令时可以不指定,常见的默认参数如下:

  • 密钥算法-keyalg):默认为 RSA
  • 密钥大小-keysize):默认为 2048 位。
  • 密钥库类型-keystore):默认为 JKS(Java keystore)。
  • 密钥库密码-storepass):没有默认值,需要用户输入。
  • 密钥密码-keypass):如果未指定,将使用密钥库密码作为密钥密码。
  • 密钥有效期-validity):默认为 365 天。
  • 密钥库文件-keystore):如果未指定,将使用 .keystore 文件。

例如:

  • 下面是一个创建密钥对的命令,使用了一些默认参数:
shell 复制代码
keytool -genkeypair -alias example -keyalg RSA -keysize 2048 -validity 365

在这个命令中,-alias 用于指定密钥对的别名,其他参数使用默认值。

2.2 创建密钥库和密钥条目

密钥库 是存储一个或多个密钥条目的文件,每个密钥条目应该以一个别名标识,它包含 密钥证书 相关信息。

有两种方式来生成密钥条目:

  • 如果使用 keytool -genkeypair 命令生成密钥条目,则会生成一个密钥对(公钥和相关私钥)并将公钥包装到 X.509 v3 自签名证书中,该证书存储为单个元素证书链,此证书链和私钥存储在以别名标识的密钥库条目中,条目类型为 PrivateKeyEntry
  • 如果使用 keytool -genseckey 命令生成密钥条目,则会生成一个密钥并将其存储在以别名标识的密钥库条目中,条目类型为 SecretKeyEntry

下面以 keytool -genkeypair 命令为例,创建一个新的密钥库 ,并生成一个名为 www.bo.org密钥条目,命令如下:

shell 复制代码
keytool -genkeypair -alias www.bo.org -keyalg RSA -keystore d:\keystore\bo.keystore -storetype pkcs12
  • -genkeypair:简写 -genkey生成一对非对称密钥 ,并将公钥包装到 X.509 v3 自签名证书中;
  • -alias指定密钥条目的别名,该别名是公开的;
  • -keyalg指定加密算法,本例中采用通用的 RSA 加密算法;
  • -keystore指定密钥库的路径及名称 ,若密钥库不存在则创建。若不指定则默认在操作系统的用户目录下生成一个 .keystore 的文件;
  • -storetype指定密钥库的类型 ,如果不指定,默认是 JKS。如果创建默认类型密钥库,命令行会提示转化为 pkcs12 类型,所以这里在创建时指定。

执行后,会需要填写相关的信息,如下所示:

shell 复制代码
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
  [Unknown]:  www.bo.org
您的组织单位名称是什么?
  [Unknown]:  baidu
您的组织名称是什么?
  [Unknown]:  baidu
您所在的城市或区域名称是什么?
  [Unknown]:  bj
您所在的省/市/自治区名称是什么?
  [Unknown]:  bj
该单位的双字母国家/地区代码是什么?
  [Unknown]:  cn
CN=www.bo.org, OU=xinwei, O=xinwei, L=bj, ST=bj, C=cn是否正确?
  [否]:  y

注意:

  1. 如果指定的密钥库是 第一次创建,则必须在创建时初始化一个条目。
  2. 密钥库的 密码至少 6 个字符,可以是纯数字、纯字母、数字和字母的组合等。
  3. 名字与姓名应该是输入域名,而不是我们的个人姓名。
  4. 如果创建默认类型(JKS)的密钥库,则可附加 -keypass 参数指定条目的密钥口令,如果没有指定则会在最后一步提示 输入该条目的密钥口令,如果与密钥库口令相同按回车,一般设为与密钥库口令相同。
  5. 如果创建 PKCS12 类型的密钥库,则会忽略条目的密钥口令相关参数,因为 PKCS12 不支持设置密钥库条目密码,默认它与密钥库密码一致。

执行完上述命令后,在操作系统的指定目录下生成了一个 "bo.keystore" 的文件。

2.3 查看密钥库信息

例如:查看名为 "bo.keystore" 的密钥库信息。

命令如下:

shell 复制代码
keytool -list -v -keystore d:\keystore\bo.keystore

执行结果:

shell 复制代码
输入密钥库口令:


密钥库类型: JKS
密钥库提供方: SUN

您的密钥库包含 1 个条目

别名: www.bo.org
创建日期: 2024-8-21
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=www.bo.org, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
发布者: CN=www.bo.org, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
序列号: 209f255e
有效期开始日期: Wed Aug 21 16:54:14 CST 2024, 截止日期: Tue Nov 19 16:54:14 CST 2024
证书指纹:
         MD5: 99:4A:45:9D:B0:21:AA:98:BB:50:CC:E3:27:F1:64:72
         SHA1: 8A:DF:0E:6A:6B:B0:E3:7D:ED:90:6D:64:D0:F8:1C:72:C6:91:94:0D
         SHA256: E1:88:EF:C4:C2:AC:F3:FA:F2:A0:C4:B4:A7:5E:40:24:24:3E:EE:DA:97:6D:82:E3:CB:3C:60:07:B9:97:35:1B
         签名算法名称: SHA256withRSA
         版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: BB CB 38 12 73 3A F8 3A   90 0E 23 02 2F D9 44 BC  ..8.s:.:..#./.D.
0010: 0A 5C CD 96                                        .\..
]
]



*******************************************
*******************************************

2.4 导出密钥库条目证书

例如:将密钥库 bo.keystore 中别名为 www.bo.org 条目的相关信息以及公钥导出到一个数字证书文件 bo.crt 中。

命令如下:

shell 复制代码
keytool -exportcert -keystore d:\keystore\bo.keysotre -alias www.bo.org -file d:\keystore\bo.crt

运行结果:

shell 复制代码
输入密钥库口令:
存储在文件 <d:\keystore\bo.crt> 中的证书
  • 该命令会在操作系统的指定目录下生成一个 "bo.crt" 的文件,注意该证书文件不包含私钥。

2.5 导入信任证书到密钥库

例如:将信任证书 test.crt 以别名 test 导入到密钥库 bo.keystore 中。

命令如下:

shell 复制代码
keytool -importcert -file d:\keystore\test.crt -alias test -keystore d:\keystore\bo.keystore

执行结果:

shell 复制代码
输入密钥库口令:

所有者: CN=Badb, OU=X/Secure, O=Baltimore Technologies Ltd., ST=Dublin, C=IE
发布者: CN=Another Transient CA, OU=X/Secure, O=Baltimore Technologies Ltd., ST=Dublin, C=IE
序列号: ecf921674a
有效期开始日期: Wed Apr 03 07:59:57 CST 2002, 截止日期: Tue Apr 03 06:59:46 CST 2012
证书指纹:
         MD5: 12:F1:0E:0E:78:23:D2:05:51:BE:5A:AF:91:C9:4E:19
         SHA1: 2C:13:B3:7E:4B:04:DA:AD:7E:78:D9:99:0C:6E:4D:83:C0:72:CB:84
         SHA256: 8F:47:C8:66:E0:FC:63:82:4A:E2:69:AA:8F:2A:DB:A6:33:B1:C0:C5:6F:48:58:7A:9C:07:3E:00:77:42:01:8D
         签名算法名称: SHA1withDSA
         版本: 3

扩展:

#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 8A 1C 56 30 5A 32 12 7D                            ..V0Z2..
]
]

#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
  DigitalSignature
]

#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 80 B4 04 6A CA D1 35 A8                            ...j..5.
]
]

是否信任此证书? [否]:  y
证书已添加到密钥库中

导入 test.crt 证书后,再次查看密钥库 bo.keystore 信息,新增一个 test 条目。

命令如下:

shell 复制代码
keytool -list -v -keystore d:\keystore\bo.keystore

执行结果:

shell 复制代码
输入密钥库口令:


密钥库类型: JKS
密钥库提供方: SUN

您的密钥库包含 2 个条目

别名: www.bo.org
创建日期: 2024-8-21
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=www.bo.org, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
发布者: CN=www.bo.org, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
序列号: 209f255e
有效期开始日期: Wed Aug 21 16:54:14 CST 2024, 截止日期: Tue Nov 19 16:54:14 CST 2024
证书指纹:
         MD5: 99:4A:45:9D:B0:21:AA:98:BB:50:CC:E3:27:F1:64:72
         SHA1: 8A:DF:0E:6A:6B:B0:E3:7D:ED:90:6D:64:D0:F8:1C:72:C6:91:94:0D
         SHA256: E1:88:EF:C4:C2:AC:F3:FA:F2:A0:C4:B4:A7:5E:40:24:24:3E:EE:DA:97:6D:82:E3:CB:3C:60:07:B9:97:35:1B
         签名算法名称: SHA256withRSA
         版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: BB CB 38 12 73 3A F8 3A   90 0E 23 02 2F D9 44 BC  ..8.s:.:..#./.D.
0010: 0A 5C CD 96                                        .\..
]
]



*******************************************
*******************************************


别名: test
创建日期: 2024-8-21
条目类型: trustedCertEntry

所有者: CN=Badb, OU=X/Secure, O=Baltimore Technologies Ltd., ST=Dublin, C=IE
发布者: CN=Another Transient CA, OU=X/Secure, O=Baltimore Technologies Ltd., ST=Dublin, C=IE
序列号: ecf921674a
有效期开始日期: Wed Apr 03 07:59:57 CST 2002, 截止日期: Tue Apr 03 06:59:46 CST 2012
证书指纹:
         MD5: 12:F1:0E:0E:78:23:D2:05:51:BE:5A:AF:91:C9:4E:19
         SHA1: 2C:13:B3:7E:4B:04:DA:AD:7E:78:D9:99:0C:6E:4D:83:C0:72:CB:84
         SHA256: 8F:47:C8:66:E0:FC:63:82:4A:E2:69:AA:8F:2A:DB:A6:33:B1:C0:C5:6F:48:58:7A:9C:07:3E:00:77:42:01:8D
         签名算法名称: SHA1withDSA
         版本: 3

扩展:

#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 8A 1C 56 30 5A 32 12 7D                            ..V0Z2..
]
]

#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
  DigitalSignature
]

#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 80 B4 04 6A CA D1 35 A8                            ...j..5.
]
]



*******************************************
*******************************************
  • test.crt 是由另一个密钥库 test.keysotre 生成的证书,将其导入到密钥库 bo.keystore指定的条目别名不能与密钥库中已存在的条目别名重复 (导入签发证书除外),一般与导出该证书的密钥库条目别名相同,此时的导入条目会以信任证书的形式保存,条目类型为 trustedCertEntry

  • 如果尝试将证书 test.crt 以别名 www.bo.org 导入到密钥库 bo.keystore 中,则会提示操作非法,如下所示:

命令如下:

shell 复制代码
keytool -importcert -file d:\keystore\test.crt -alias www.bo.org -keystore d:\keystore\bo.keystore

执行结果:

shell 复制代码
输入密钥库口令:

keytool 错误: java.lang.Exception: 回复中的公共密钥与密钥库不匹配

2.6 打印证书内容

例如:打印密钥库 bo.keystore 中别名为 www.bo.org 条目导出的证书 bo.crt

命令如下:

shell 复制代码
keytool -printcert -v -file d:\keystore\bo.crt

执行结果:

shell 复制代码
所有者: CN=www.bo.org, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
发布者: CN=www.bo.org, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
序列号: 209f255e
有效期开始日期: Wed Aug 21 16:54:14 CST 2024, 截止日期: Tue Nov 19 16:54:14 CST 2024
证书指纹:
         MD5: 99:4A:45:9D:B0:21:AA:98:BB:50:CC:E3:27:F1:64:72
         SHA1: 8A:DF:0E:6A:6B:B0:E3:7D:ED:90:6D:64:D0:F8:1C:72:C6:91:94:0D
         SHA256: E1:88:EF:C4:C2:AC:F3:FA:F2:A0:C4:B4:A7:5E:40:24:24:3E:EE:DA:97:6D:82:E3:CB:3C:60:07:B9:97:35:1B
         签名算法名称: SHA256withRSA
         版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: BB CB 38 12 73 3A F8 3A   90 0E 23 02 2F D9 44 BC  ..8.s:.:..#./.D.
0010: 0A 5C CD 96                                        .\..
]
]

补充: 也可以使用 -sslserver ip:port 的参数,直接从网络上打印出某个 ssl server 提供的证书内容。

2.7 删除密钥库条目

例如:删除密钥库 bo.keystore 中别名为 test 的证书条目。

命令如下:

shell 复制代码
keytool -delete -keystore d:\keystore\bo.keystore -alias test

执行结果:

2.8 证书签发与导入

这个过程涉及到 3 个命令:-certreq-gencert-importcert

证书签发过程:

1)机构 A 使用 -certreq 命令生成一个证书签名请求文件 CSR(certificate sign request) 并将其发送给机构 B。

2)机构 B 接收到这个请求后,使用 -gencert 命令签发证书,会生成一个证书或证书链。

3)机构 A 接收到响应后,使用 -importcert 命令将签发证书导入到 keystore 中。

例如:将密钥库 test.keystore 签发的证书导入到 bo.keystore 中。

第一步:-genkeypair 命令,创建 test.keystore 密钥库

命令如下:

shell 复制代码
keytool -genkeypair -alias test -keyalg RSA -keystore d:\keystore\test.keystore -storetype pkcs12

执行结果:

shell 复制代码
输入密钥库口令:

再次输入新口令:

您的名字与姓氏是什么?
  [Unknown]:  test
您的组织单位名称是什么?
  [Unknown]:  baidu
您的组织名称是什么?
  [Unknown]:  baidu
您所在的城市或区域名称是什么?
  [Unknown]:  bj
您所在的省/市/自治区名称是什么?
  [Unknown]:  bj
该单位的双字母国家/地区代码是什么?
  [Unknown]:  cn
CN=test, OU=baidu, O=baidu, L=bj, ST=bj, C=cn是否正确?
  [否]:  y
第二步:-certreq 命令,生成证书签名请求文件CSR

命令如下:

shell 复制代码
keytool -certreq -alias www.bo.org -keystore d:\keystore\bo.keystore -file d:\keystore\cert.csr
  • 这条命令的作用是:将条目别名为 www.bo.org 的公钥和一些个人信息从密钥库 bo.keystore 文件中导出为 CSR 文件,作为证书请求文件。

执行结果:

第三步:-gencert 命令,签发证书

命令如下:

shell 复制代码
keytool -gencert -infile d:\keystore\cert.csr -outfile d:\keystore\test_to_bo.crt -alias test -keystore d:\keystore\test.keystore
  • 这条命令的作用是:使用密钥库 test.keystore 中别名为 test 的条目私钥,为 cert.csr 签发证书,并保存到 test_to_bo.crt 文件中。

执行结果:

第四步:-importcert 命令,导入签发证书到密钥库

命令如下:

shell 复制代码
keytool -importcert -file d:\keystore\test_to_bo.crt -alias www.bo.org -keystore d:\keystore\bo.keystore
  • 这条命令的作用是:将签发证书 test_to_bo.crt 更新到已存在别名 www.bo.org 的密钥库 bo.keystore 中。

执行结果:

  • 命令行提示错误 无法从回复中建立链,这是因为 在更新被签发证书之前,一定要先将签发证书的机构的信任证书导入到密钥库文件中 ,即:将密钥库 test.keystore 的证书以相应的别名导入到密钥库 bo.keystore 中。
1)导出 test.keystore 的信任证书:

命令如下:

shell 复制代码
keytool -exportcert -keystore d:\keystore\test.keystore -alias test -file d:\keystore\test.crt

执行结果:

2)将信任证书 test.crt 以其别名 "test" 导入到密钥库 bo.keystore 中:

命令如下:

shell 复制代码
keytool -importcert -file d:\keystore\test.crt -alias test -keystore d:\keystore\bo.keystore

执行结果:

shell 复制代码
输入密钥库口令:

存储在文件 <d:\keystore\test.crt> 中的证书

D:\keystore>keytool -importcert -file d:\keystore\test.crt -alias test -keystore d:\keystore\bo.keystore
输入密钥库口令:

所有者: CN=test, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
发布者: CN=test, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
序列号: 642958b
有效期开始日期: Wed Aug 21 21:53:08 CST 2024, 截止日期: Tue Nov 19 21:53:08 CST 2024
证书指纹:
         MD5: BB:F7:AF:FF:60:BF:C8:A8:C2:D7:9F:5D:84:B7:E6:A0
         SHA1: 5A:9B:82:36:D3:5D:8A:0A:7B:59:9C:22:89:6E:43:7B:9C:DD:A7:AD
         SHA256: 46:F8:27:81:C4:42:A4:2B:08:CD:F2:E2:2E:2D:AC:FC:E9:6B:E3:83:D3:3E:2C:A0:B8:AA:8A:98:A3:D6:47:C7
         签名算法名称: SHA256withRSA
         版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 5D 5B 4E 39 D6 6A DE 06   8E 3E 86 CF C0 AF 0F 6E  ][N9.j...>.....n
0010: 84 85 B2 74                                        ...t
]
]

是否信任此证书? [否]:  y
证书已添加到密钥库中
3)将签发证书 test_to_bo.crt 以别名 "www.bo.org" 导入到密钥库 bo.keystore:

命令如下:

shell 复制代码
keytool -importcert -file d:\keystore\test_to_bo.crt -alias www.bo.org -keystore d:\keystore\bo.keystore

执行结果:

4)验证证书导入结果:

此时,密钥库 bo.keystore 中别名为 www.bo.org 条目的自签名证书已被更新为由密钥库 test.keystore 签名的签发证书。可以通过之前介绍过的 -list 命令进行查看。

命令如下:

shell 复制代码
keytool -list -v -keystore d:\keystore\bo.keystore

执行结果:

shell 复制代码
输入密钥库口令:


密钥库类型: JKS
密钥库提供方: SUN

您的密钥库包含 2 个条目

别名: www.bo.org
创建日期: 2024-8-22
条目类型: PrivateKeyEntry
证书链长度: 2
证书[1]:
所有者: CN=www.bo.org, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
发布者: CN=test, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
序列号: 38e34d2
有效期开始日期: Wed Aug 21 22:14:04 CST 2024, 截止日期: Tue Nov 19 22:14:04 CST 2024
证书指纹:
         MD5: 4E:1B:5A:8A:D0:64:8B:81:CF:D9:0D:92:E0:B8:7E:A4
         SHA1: 14:3C:0E:CC:F0:5A:28:2A:CC:FF:33:34:C9:59:E5:C4:9A:6F:B9:3A
         SHA256: 9C:41:67:AC:59:AE:81:1A:15:23:5E:39:F1:D6:19:08:A0:3B:E8:8F:EA:C8:7D:07:BF:A4:0E:92:B9:AC:50:B4
         签名算法名称: SHA256withRSA
         版本: 3

扩展:

#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 5D 5B 4E 39 D6 6A DE 06   8E 3E 86 CF C0 AF 0F 6E  ][N9.j...>.....n
0010: 84 85 B2 74                                        ...t
]
]

#2: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: BB CB 38 12 73 3A F8 3A   90 0E 23 02 2F D9 44 BC  ..8.s:.:..#./.D.
0010: 0A 5C CD 96                                        .\..
]
]

证书[2]:
所有者: CN=test, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
发布者: CN=test, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
序列号: 642958b
有效期开始日期: Wed Aug 21 21:53:08 CST 2024, 截止日期: Tue Nov 19 21:53:08 CST 2024
证书指纹:
         MD5: BB:F7:AF:FF:60:BF:C8:A8:C2:D7:9F:5D:84:B7:E6:A0
         SHA1: 5A:9B:82:36:D3:5D:8A:0A:7B:59:9C:22:89:6E:43:7B:9C:DD:A7:AD
         SHA256: 46:F8:27:81:C4:42:A4:2B:08:CD:F2:E2:2E:2D:AC:FC:E9:6B:E3:83:D3:3E:2C:A0:B8:AA:8A:98:A3:D6:47:C7
         签名算法名称: SHA256withRSA
         版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 5D 5B 4E 39 D6 6A DE 06   8E 3E 86 CF C0 AF 0F 6E  ][N9.j...>.....n
0010: 84 85 B2 74                                        ...t
]
]



*******************************************
*******************************************


别名: test
创建日期: 2024-8-22
条目类型: trustedCertEntry

所有者: CN=test, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
发布者: CN=test, OU=baidu, O=baidu, L=bj, ST=bj, C=cn
序列号: 642958b
有效期开始日期: Wed Aug 21 21:53:08 CST 2024, 截止日期: Tue Nov 19 21:53:08 CST 2024
证书指纹:
         MD5: BB:F7:AF:FF:60:BF:C8:A8:C2:D7:9F:5D:84:B7:E6:A0
         SHA1: 5A:9B:82:36:D3:5D:8A:0A:7B:59:9C:22:89:6E:43:7B:9C:DD:A7:AD
         SHA256: 46:F8:27:81:C4:42:A4:2B:08:CD:F2:E2:2E:2D:AC:FC:E9:6B:E3:83:D3:3E:2C:A0:B8:AA:8A:98:A3:D6:47:C7
         签名算法名称: SHA256withRSA
         版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 5D 5B 4E 39 D6 6A DE 06   8E 3E 86 CF C0 AF 0F 6E  ][N9.j...>.....n
0010: 84 85 B2 74                                        ...t
]
]



*******************************************
*******************************************
5)验证结果:
  • 对比最开始生成的密钥库 bo.keystore 的证书信息可发现,别名为 "www.bo.org " 条目的 证书链已由单个 bo.keystore 自签名的证书变为 2 个证书 ,分别是 test.keystore 签名的 bo.keystore 证书、test.keystore 的自签名证书。

三、补充

3.1 导出 .p12/.pfx 文件

.p12.pfx 文件为同一类型,没有任何差异,均为 PKCS#12 格式,这是一种跨平台的标准格式,可以包含 私钥公钥证书 ,以及 证书链

  • 使用 keytool 的 -importkeystore 命令可以将 .jks.keystore 文件中的密钥和证书导出到 .p12 文件中。

命令如下:

shell 复制代码
keytool -importkeystore -srckeystore bo.keystore -srcalias www.bo.org -destkeystore bo.p12 -deststoretype pkcs12
  • -srckeystore:指定 源密钥库文件的路径
  • -srcalias:指定 要导出的密钥别名
  • -destkeystore:指定 目标密钥库文件的路径和名称
  • -deststoretype:指定 目标密钥库的类型(在这里是PKCS12)。

执行结果:

3.2 -importkeystore 命令

命令如下:

shell 复制代码
keytool -importkeystore -help

执行结果:

shell 复制代码
从其他密钥库导入一个或所有条目

选项:

 -srckeystore <srckeystore>            源密钥库名称
 -destkeystore <destkeystore>          目标密钥库名称
 -srcstoretype <srcstoretype>          源密钥库类型
 -deststoretype <deststoretype>        目标密钥库类型
 -srcstorepass <arg>                   源密钥库口令
 -deststorepass <arg>                  目标密钥库口令
 -srcprotected                         受保护的源密钥库口令
 -srcprovidername <srcprovidername>    源密钥库提供方名称
 -destprovidername <destprovidername>  目标密钥库提供方名称
 -srcalias <srcalias>                  源别名
 -destalias <destalias>                目标别名
 -srckeypass <arg>                     源密钥口令
 -destkeypass <arg>                    目标密钥口令
 -noprompt                             不提示
 -providerclass <providerclass>        提供方类名
 -providerarg <arg>                    提供方参数
 -providerpath <pathlist>              提供方类路径
 -v                                    详细输出

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

四、总结

总之,keytool 是一个功能强大且灵活的工具,能够满足大多数与密钥和证书管理相关的开发需求。通过熟练掌握其命令和参数,开发者可以高效地进行安全通信和身份验证操作。

整理完毕,完结撒花~🌻

参考地址:

1.Keytool 实用程序:Java数字证书和密钥管理的核心工具,https://developer.baidu.com/article/details/3310950

2.Java证书工具keytool用法总结,https://blog.csdn.net/w47_csdn/article/details/87564029

相关推荐
Anakki5 天前
【SSL证书】腾讯云SSL续签备忘录
网络协议·证书·腾讯云·ssl·续签
雨雪飘零14 天前
Windows系统使用OpenSSL生成自签名证书
nginx·证书·openssl
怒放de生命201020 天前
cerbot 实现通配符子域名证书+续期
证书·ssl·通配符·cerbot
SuperHeroWu71 个月前
华为应用市场增长优化(一)
华为·证书·harmonyos·鸿蒙·应用市场增长优化
椰椰椰耶2 个月前
【HTTPS】中间人攻击和证书的验证
https·证书
ChampionDragon3 个月前
汽车一些身份认证技术术语
证书·身份认证·ca
JUNIOR_MU4 个月前
【VMware VCF】VMware Cloud Foundation Part 04:准备 ESXi 主机。
证书·esxi·dns·ntp·vcf·vmware cloud foundation
码大哈的园子4 个月前
使用个人p12证书请求https接口数据
网络协议·https·证书
岚天start4 个月前
SSL证书到期自动巡检脚本-推送钉钉告警
证书·钉钉·ssl·自动巡检