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 条目

Keytool 工具使用的更多相关文章

  1. Java Security:keytool工具使用说明

    Keytool用法说明 Keytool是一个key与cert的管理工具.使用keytool可以管理public key.private key,以及与key之相关的certificate. 1.com ...

  2. tomcat配置https–采用JDK自带的keytool工具生成证书

    转自:http://blog.csdn.net/huangxinyu_it/article/details/41693633 有关http与https的区别请看<浅谈http与https的区别( ...

  3. 使用keytool工具产生带根CA和二级CA的用户证书

    使用keytool工具产生带根CA和二级CA的用户证书 1 生成根CA 1.1 生成根CA证书   根CA实际是一张自签CA,自签CA的使用者和颁发者都是它自己.使用下面的命令生成根证书,如果没有指定 ...

  4. ssl证书与java keytool工具

    ssl协议 SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安 ...

  5. Keystore概念,Keytool工具使用

    几个概念 keystore是一个密码保护的文件,用来存储密钥和证书(也就是说,keystore中存储的有两类型entries):这个文件(默认的)位于你的home目录,也就是你登录到操作系统的用户名的 ...

  6. 使用Keytool工具生成证书Keystore和证书签名请求文件

    内容概览: keytool的几个常用的命令. 1.创建证书 2.查看证书库 3.导出证书文件 4.导入证书的信息 5.查看证书信息 6.删除密钥库中的条目 7.修改证书条目的口令 ---------- ...

  7. keytool工具生成自签名证书并且通过浏览器导入证书

    1.生成服务器证书库 keytool -genkey -alias tomcat -keypass changeit -keyalg RSA -keysize 1024 -validity 365 - ...

  8. 利用keytool工具生成数字证书

    一.制作数字证书  因测试微信小程序, 腾讯要求使用 https协议,所以需要使用证书.使用jdk工具制作数字证书流程如下: 1.查看JDK是否安装,使用命令java -version 2.切换目录至 ...

  9. 使用JDK自带的keytool工具生成证书

    一.keytool 简介 keytool 是java用于管理密钥和证书的工具,它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及 ...

随机推荐

  1. JavaScript——三

    任务: 其中的"options = options || {}"就代表如果options是一个真的对象,就使用它,否则就给他默认值 在Node函数中: 函数中的this指向wind ...

  2. 错误: 未能完成程序集的安装(hr = 0x8007000b)。探测终止。

     解决方案:VS中"工具"->"选项"->"Web项目"->"对网站和项目使用IIS Express的64位版& ...

  3. 如何创建一个GETH节点(单节点,windows环境)

    所有命令都是在powershell上执行的 1.创建"创世块" 初始化配置 创建一个 hdgenesis.json文件,拷贝到geth根目录 {    "config&q ...

  4. VS制作可自动覆盖旧版本的安装包

    1.设置属性 DetectNewerInstalledVersion=TrueInstallAllUsers = TrueRemovePreviousVersion = True 2.增加软件版本号, ...

  5. Windows 10 & git & bash

    Windows 10 & git & bash If you are on Windows, we recommend downloading Git for Windows and ...

  6. Chrome Canary crashed bug

    Chrome Canary crashed bug Aw, Snap https://support.google.com/chrome/?p=e_awsnap clear cache, 使用隐身模式 ...

  7. 前端安全 All In One

    前端安全 All In One refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  8. Caddyfile 是干什么的?

    Caddyfile 是干什么的? The Caddyfile is a convenient Caddy configuration format for humans. It is most peo ...

  9. react slot component with args

    react slot component with args how to pass args to react props child component https://codesandbox.i ...

  10. regex read once bug

    regex read once bug read once bug StackOverflow Question https://stackoverflow.com/questions/5916796 ...