Keytool 工具使用

Keytool

管理私钥仓库(keystore)和与之相关的 X.509 证书链(用以验证与私钥对应的公钥),也可以用来管理其他信任实体

  • keytool 将密钥和证书存储在一个所谓的密钥仓库中,缺省的密钥仓库实现将密钥仓库实现为一个文件,用口令保护私钥

  • 在密钥仓库中存在两种不同的类型项 :

    • 密钥项(PrivateKeyEntry)

      存放极为敏感的加密密钥信息。这种信息以一种受保护的格式存储以防止未授权的访问,通常该密钥为机密密钥,或是伴有用于认证相应公钥用的证书”链”的私钥

    • 可信任证书项(TrustCertEntry)

      每项包含一个属于个人或团体的公钥证书

  • 密钥仓库别名(alias)

    1、对所有的密钥仓库项(密钥项和可信任证书项)的访问都要通过唯一的别名的进行,别名不区分大小写

    2、当用 -genkey 命令来生成密钥对(公钥和私钥)或者用 -import 命令来将证书或证书链加到可信任证书的清单中,以增加一个实体到密钥仓库中,必须指定了一个别名

    3、例如使用别名 duke 生成新的密钥对并将公钥用以下命令打包到自签名证书中(参见证书链)

    keytool -genkey -alias duke -keypass dukekeypasswd

    4、更改 duke de 私钥口令,可用如下命令

    keytool -keypasswd -alias duke -keypass dukekeypasswd -new 123456

  • 密钥仓库位置

    1、每个 keytool 命令都有一个 -keystore 选项,用于指定 keytool 管理的密钥仓库的永久密钥仓库文件名称及其位置。缺省情况下,密钥仓库存储在用户宿主目录下(由系统属性的 “user.home”决定)中名为 .keystore 的文件中

    2、当使用 -genkey 或 import 或 identitydb 时,如果像尚不存在的密钥仓库添加数据时就创建一个缺省的密钥仓库

    3、如果在 -keystore 选项中指定了一个并不存在的密钥仓库,则该密钥仓库将被创建

    4、如果不指定 -keystore 选项,则将创建一个缺省的密钥仓库 .keystore

命令

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

  • 查看 keytool 用法

    E:\keytoolTest>keytool -help
    
    密钥和证书管理工具
    
    命令:
    
     -certreq            生成证书请求
    
     -changealias        更改条目的别名
    
     -delete             删除条目
    
     -exportcert         导出证书
    
     -genkeypair         生成密钥对
    
     -genseckey          生成密钥
    
     -gencert            根据证书请求生成证书
    
     -importcert         导入证书或证书链
    
     -importpass         导入口令
    
     -importkeystore     从其他密钥库导入一个或所有条目
    
     -keypasswd          更改条目的密钥口令
    
     -list               列出密钥库中的条目
    
     -printcert          打印证书内容
    
     -printcertreq       打印证书请求的内容
    
     -printcrl           打印 CRL 文件的内容
    
     -storepasswd        更改密钥库的存储口令
    
    使用 "keytool -command_name -help" 获取 command_name 的用法
    
  • 根据 keytool -command_name -help 提示,查看每个命令的用法,以 -genkeypair 命令为例

    E:\keytoolTest>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" 获取所有可用命令
    

    解释 :

    1. 第 4 行 ,生成密钥对 表示该命令的作用是生成密钥对

    2. 第 6 行 ,选项表示紧接着必须在 -genkeypair 后面的可选项

    3. 第 8 行到第 26 行,表示每个选项的作用,以 -alias <alias> 选项为例,在使用生成密钥对时,在 -genkeypair 后面加上选项名 -alias ,紧接着在选项名后面输入选项值,例如 <alias> 替换成 tomcat,,如下所示

      keytool -genkeypair -alias tomcat ,生成别名为 tomcat 的密钥对

    4. 如果多个选项时,继续在第 3 步的基础上添加选项名和选项值,例如 :

      keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -validity 365 -keypass 123456 -storepass 123456 -storetype JKS -keystore tomcat.keystore

      以上说明一下:

      ​ -keyalg RSA,说明生成的密钥对是 RSA 密钥

      -keysize 2048,说明密钥长度为 2048

      ​ -sigalg SHA256withRSA,说明使用 SHA256withRSA 签名算法生成证书

      ​ -validity 365,有效期 365 天

      ​ -keypass 123456,私钥密码(访问私钥使用,一般不建议直接写,要在终端输入)

      ​ -storepass 123456,密钥库密码(访问密钥库使用)

      ​ -storetype JKS,密钥库类型

      ​ -keystore tomcat.keystore,说明私钥和证书都保存在文件 tomcat.keystore

    • 执行第 4 步,就生成了一个 tomcat.keystore 文件

      E:\keytoolTest>keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -validity 365 -keypass 123456 -storepass 123456 -storetype JKS -keystore tomcat.keystore
      您的名字与姓氏是什么?
        [Unknown]:  tomcat
      您的组织单位名称是什么?
        [Unknown]:  JNKY
      您的组织名称是什么?
        [Unknown]:  JNKY
      您所在的城市或区域名称是什么?
        [Unknown]:  GZ
      您所在的省/市/自治区名称是什么?
        [Unknown]:  GD
      该单位的双字母国家/地区代码是什么?
        [Unknown]:  CN
      CN=tomcat, OU=JNKY, O=JNKY, L=GZ, ST=GD, C=CN是否正确?
        [否]:  是
      
    • 生成 tomcat.keystore 之后,可以通过 -list 命令去查看

      • 了解 -list 命令用法
      E:\keytoolTest>keytool -list -help
      keytool -list [OPTION]...
      
      列出密钥库中的条目
      
      选项:
      
       -rfc                            以 RFC 样式输出
       -alias <alias>                  要处理的条目的别名
       -keystore <keystore>            密钥库名称
       -storepass <arg>                密钥库口令
       -storetype <storetype>          密钥库类型
       -providername <providername>    提供方名称
       -providerclass <providerclass>  提供方类名
       -providerarg <arg>              提供方参数
       -providerpath <pathlist>        提供方类路径
       -v                              详细输出
       -protected                      通过受保护的机制的口令
      
      使用 "keytool -help" 获取所有可用命令
      
      • 使用命令

        keytool -list -keystore tomcat.keystore

      E:\keytoolTest>keytool -list -keystore tomcat.keystore
      输入密钥库口令:
      密钥库类型: jks
      密钥库提供方: SUN
      
      您的密钥库包含 1 个条目
      
      tomcat, 2021-3-8, PrivateKeyEntry,
      证书指纹 (SHA1): 0D:7F:86:A7:EB:2C:65:F6:62:4F:2C:D5:50:A7:7E:72:37:31:74:B0
      
      Warning:
      JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore tomcat.keystore -destkeystore tomcat.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
      
      当需要详细查看时(其他命令都是可选的)
      

      ​ keytool -list -keystore tomcat.keystore -v(这里输入的输入密钥库口令是第 4 步可选项的 123456( -storepass 123456))

      E:\keytoolTest>keytool -list -keystore tomcat.keystore -v
      输入密钥库口令:
      密钥库类型: jks
      密钥库提供方: SUN
      
      您的密钥库包含 1 个条目
      
      别名: tomcat
      创建日期: 2021-3-8
      条目类型: PrivateKeyEntry
      证书链长度: 1
      证书[1]:
      所有者: CN=tomcat, OU=JNKY, O=JNKY, L=GZ, ST=GD, C=CN
      发布者: CN=tomcat, OU=JNKY, O=JNKY, L=GZ, ST=GD, C=CN
      序列号: 28d0aa93
      有效期为 Mon Mar 08 16:51:38 CST 2021 至 Tue Mar 08 16:51:38 CST 2022
      证书指纹:
               MD5:  84:A6:F6:4E:5A:B2:F5:0C:F9:CA:CF:84:5B:9F:C3:DD
               SHA1: 0D:7F:86:A7:EB:2C:65:F6:62:4F:2C:D5:50:A7:7E:72:37:31:74:B0
               SHA256: 29:4A:5F:E9:57:73:58:90:33:6E:84:EE:E3:8C:C0:6E:7D:26:22:14:9C:3A:3A:D7:2F:32:BE:83:31:CD:B8:46
      签名算法名称: SHA256withRSA
      主体公共密钥算法: 2048 位 RSA 密钥
      版本: 3
      
      扩展:
      
      #1: ObjectId: 2.5.29.14 Criticality=false
      SubjectKeyIdentifier [
      KeyIdentifier [
      0000: EA 21 0E 80 EC 2E D2 A8   CC CA 9B 1A 48 5D 31 95  .!..........H]1.
      0010: D7 31 79 E9                                        .1y.
      ]
      ]
      
      
      
      *******************************************
      *******************************************
      
      
      
      Warning:
      JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore tomcat.keystore -destkeystore tomcat.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
      

      密码不正确会报错

      E:\keytoolTest>keytool -list -keystore tomcat01.keystore -v
      输入密钥库口令:
      keytool 错误: java.io.IOException: Keystore was tampered with, or password was incorrect
      java.io.IOException: Keystore was tampered with, or password was incorrect
              at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:780)
              at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:56)
              at sun.security.provider.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:224)
              at sun.security.provider.JavaKeyStore$DualFormatJKS.engineLoad(JavaKeyStore.java:70)
              at java.security.KeyStore.load(KeyStore.java:1445)
              at sun.security.tools.keytool.Main.doCommands(Main.java:926)
              at sun.security.tools.keytool.Main.run(Main.java:366)
              at sun.security.tools.keytool.Main.main(Main.java:359)
      Caused by: java.security.UnrecoverableKeyException: Password verification failed
              at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:778)
              ... 7 more
      

命令扩展

  • 生成一个测试使用的 tomcat01.keystore

    keytool -genkeypair -alias tomcat01 -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -validity 365 -keypass 123456 -storepass 12345678 -storetype JKS -keystore tomcat01.keystore

-changealias 更改条目的别名命令

  • 查看命令用法

    E:\keytoolTest>keytool -changealias -help
    keytool -changealias [OPTION]...
    
    更改条目的别名
    
    选项:
    
     -alias <alias>                  要处理的条目的别名
     -destalias <destalias>          目标别名
     -keypass <arg>                  密钥口令
     -keystore <keystore>            密钥库名称
     -storepass <arg>                密钥库口令
     -storetype <storetype>          密钥库类型
     -providername <providername>    提供方名称
     -providerclass <providerclass>  提供方类名
     -providerarg <arg>              提供方参数
     -providerpath <pathlist>        提供方类路径
     -v                              详细输出
     -protected                      通过受保护的机制的口令
    
    使用 "keytool -help" 获取所有可用命令
    
  • 将别名 -alias 为 tomcat01 的条目改为别名 -destalias 为 tomcat02的条目

    keytool -changealias -alias tomcat01 -destalias tomcat02 -keystore tomcat01.keystore -v

    注意 : 这里的 输入密钥库口令 指的是上面的 12345678 (-storepass 12345678),输入 <tomcat01> 的密钥口令 指的是 123456(-keypass 123456)

    E:\keytoolTest>keytool -changealias -alias tomcat01 -destalias tomcat02 -keystore tomcat01.keystore -v
    输入密钥库口令:
    输入 <tomcat01> 的密钥口令
    [正在存储tomcat01.keystore]
    
    Warning:
    JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore tomcat01.keystore -destkeystore tomcat01.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
    
  • 查看是否更改成功

    keytool -list -keystore tomcat01.keystore -v ,输入密钥库口令: 指的是上面的 12345678 (-storepass 12345678)

    E:\江南科友\keytoolTest>keytool -list -keystore tomcat01.keystore -v
    输入密钥库口令:
    密钥库类型: jks
    密钥库提供方: SUN
    
    您的密钥库包含 1 个条目
    
    别名: tomcat02
    创建日期: 2021-3-8
    条目类型: PrivateKeyEntry
    证书链长度: 1
    证书[1]:
    所有者: CN=tomcat01, OU=JNKY, O=JNKY, L=GZ, ST=GD, C=CN
    发布者: CN=tomcat01, OU=JNKY, O=JNKY, L=GZ, ST=GD, C=CN
    序列号: 6979e2d4
    有效期为 Mon Mar 08 17:05:36 CST 2021 至 Tue Mar 08 17:05:36 CST 2022
    证书指纹:
             MD5:  4C:69:A9:22:E8:CB:48:4C:74:DD:59:DE:AF:A7:D5:91
             SHA1: 30:DA:94:65:67:EE:9A:7B:BD:BC:0C:E6:5A:EE:F3:68:FF:0B:B6:4C
             SHA256: E9:6E:BE:04:BF:FB:EF:BC:9E:AD:BD:D2:82:EE:2B:8B:60:60:EE:49:47:2B:10:CF:54:A1:B7:CC:81:11:2F:18
    签名算法名称: SHA256withRSA
    主体公共密钥算法: 2048 位 RSA 密钥
    版本: 3
    
    扩展:
    
    #1: ObjectId: 2.5.29.14 Criticality=false
    SubjectKeyIdentifier [
    KeyIdentifier [
    0000: C7 46 E6 39 C7 5D 3C 3B   6F AA AB 69 D7 14 BC 20  .F.9.]<;o..i...
    0010: A1 CA 0C B9                                        ....
    ]
    ]
    
    
    
    *******************************************
    *******************************************
    
    
    
    Warning:
    JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore tomcat01.keystore -destkeystore tomcat01.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
    

    注意第 8 行 ,别名: tomcat02,已修改成功

-delete 删除条目命令

  • 查看命令用法

    E:\keytoolTest>keytool -delete -help
    keytool -delete [OPTION]...
    
    删除条目
    
    选项:
    
     -alias <alias>                  要处理的条目的别名
     -keystore <keystore>            密钥库名称
     -storepass <arg>                密钥库口令
     -storetype <storetype>          密钥库类型
     -providername <providername>    提供方名称
     -providerclass <providerclass>  提供方类名
     -providerarg <arg>              提供方参数
     -providerpath <pathlist>        提供方类路径
     -v                              详细输出
     -protected                      通过受保护的机制的口令
    
    使用 "keytool -help" 获取所有可用命令
    
  • 将别名 -alias 为 tomcat02 的条目删除

    keytool -delete -alias tomcat02 -keystore tomcat01.keystore

    注意 : 这里的 输入密钥库口令 指的是上面的 12345678 (-storepass 12345678)

    E:\keytoolTest>keytool -delete -alias tomcat02 -keystore tomcat01.keystore
    输入密钥库口令:
    
  • 查看是否更改成功

    keytool -list -keystore tomcat01.keystore -v ,输入密钥库口令: 指的是上面的 12345678 (-storepass 12345678)

    E:\keytoolTest>keytool -list -keystore tomcat01.keystore -v
    输入密钥库口令:
    密钥库类型: jks
    密钥库提供方: SUN
    
    您的密钥库包含 0 个条目
    

    注意第 6 行 ,原先只有一个条目,删除后显示 0 条目

Tags: