Java中的密码学。 Keytool实用程序

哈Ha! 我向您展示了Jakob Jenkov撰写的第十篇文章“ Java Keytool”的译文,该文章来自于一系列初学者 ,他们希望学习Java密码学的基础知识。


目录:


  1. Java密码学
  2. Java密码
  3. 留言摘要
  4. Mac电脑
  5. 签章
  6. 密钥对
  7. 密钥生成器
  8. 密钥对生成器
  9. 密钥库
  10. 按键工具
  11. 证明书
  12. 证书工厂
  13. 证书路径

Keytool实用程序


Java Keytool是一种命令行工具,可以生成公用密钥/专用密钥对并将其存储在密钥库中 。 该实用程序可执行文件与Java SDK(或JRE)一起分发,因此,如果您已安装SDK,则还将预安装该文件。
可执行文件称为keytool 。 要执行它,请打开命令提示符(cmd,控制台,shell等)。 并将当前目录更改为Java SDK安装目录中的bin目录。 键入keytool ,然后按Enter 。 您应该看到类似以下内容:


 C:\Program Files\Java\jdk1.8.0_111\bin>keytool Key and Certificate Management Tool Commands: -certreq Generates a certificate request -changealias Changes an entry's alias -delete Deletes an entry -exportcert Exports certificate -genkeypair Generates a key pair -genseckey Generates a secret key -gencert Generates certificate from a certificate request -importcert Imports a certificate or a certificate chain -importpass Imports a password -importkeystore Imports one or all entries from another keystore -keypasswd Changes the key password of an entry -list Lists entries in a keystore -printcert Prints the content of a certificate -printcertreq Prints the content of a certificate request -printcrl Prints the content of a CRL file -storepasswd Changes the store password of a keystore Use "keytool -command_name -help" for usage of command_name C:\Program Files\Java\jdk1.8.0_111\bin> 

如您所见, keytool实用程序支持一组用于处理密钥,证书和密钥库的命令。 本指南将介绍这些命令中最常用的。


键盘工具脚本


Keytool命令Keytool许多参数,安装起来可能很难记住。 因此,建议您使用一系列Keytool命令创建多个CMD或Shell脚本。 这些脚本使重新执行命令变得很容易,还使您可以返回并查看密钥库的创建方式。


密钥对生成


生成密钥对(公钥/私钥)是使用Keytool实用程序的最常见任务之一。 生成的密钥对作为自签名密钥对插入到KeyStore文件中。 这是用于生成密钥对的常见命令行格式:


 -genkeypair -alias alias -keyalg keyalg -keysize keysize -sigalg sigalg -dname dname -keypass keypass -validity valDays -storetype storetype -keystore keystore -storepass storepass -providerClass provider_class_name -providerArg provider_arg -v -protected -Jjavaoption 

参数在“ Keytool参数”部分中进行了说明。 并非所有这些参数都是必需的,许多是可选的。 如果您错过了必需的参数,该实用程序将通知您。 这是将证书导入KeyStore的命令示例。 在命令行上输入命令时,切记要删除换行符。


 "C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -importcert -alias testkey -keypass 123456 -storetype JKS -keystore keystore2.jks -file cert.cert -rfc -storepass abcdef 

保管库记录列表


要列出密钥库中的条目,可以使用list命令。 下面是list命令的格式。 换行符旨在易于阅读。 在执行命令之前,请删除换行符:


 -list -alias alias -storetype storetype -keystore keystore -storepass storepass -providerName provider_name -providerClass provider_class_name -providerArg provider_arg -v -rfc -protected -Jjavaoption 

这是一个示例list命令。 记住要删除换行符!


 "C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -list -storetype JKS -keystore keystore.jks -storepass abcdef 

此命令将列出此密钥库中的所有条目。 输出将如下所示:


 Keystore type: JKS Keystore provider: SUN Your keystore contains 1 entry testkey, 19-Dec-2017, PrivateKeyEntry, Certificate fingerprint (SHA1): 4F:4C:E2:C5:DA:36:E6:A9:93:6F:10:36:9E:E5:E8:5A:6E:F2:11:16 

如果在list命令中包括alias参数,则仅列出与给定别名匹配的条目。 这是带有alias参数的示例list命令:


 "C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -list -alias testkey -storetype JKS -keystore keystore.jks -storepass abcdef 

上面命令的结果:


 testkey, 15-Dec-2017, PrivateKeyEntry, Certificate fingerprint (SHA1): 71:B0:6E:F1:E9:5A:E7:F5:5E:78:71:DC:08:80:47:E9:5F:F8:6D:25 

删除密钥库条目


同样在keytool实用程序中,有一个命令可以从密钥库中delete条目: delete 。 这是此命令的格式:


 -delete -alias alias -storetype storetype -keystore keystore -storepass storepass -providerName provider_name -providerClass provider_class_name -providerArg provider_arg -v -protected -Jjavaoption 

这是调用delete的示例。 切记在开始之前删除换行符!


 "C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -delete -alias testkey -storetype JKS -keystore keystore.jks -storepass abcdef 

此命令将删除别名存储在keystore.jks文件中的keystore.jks库条目。


证书申请生成


keytool实用程序可以使用certreq生成证书请求。 证书请求是对证书颁发机构(CA)创建组织的公共证书的请求。 创建证书请求后,必须将其发送到要创建证书的证书颁发机构(例如,Verisign,Thawte或其他证书颁发机构)。 在生成私钥和一对公钥的证书请求之前,必须在密钥存储区中生成此私钥和一对公钥(或将其导入)。 如何做到这一点可以在相应的章节中找到。 这是用于生成证书请求的命令格式。 使用此命令时,请记住删除所有换行符:


 -certreq -alias alias -sigalg sigalg -file certreq_file -keypass keypass -storetype storetype -keystore keystore -storepass storepass -providerName provider_name -providerClass provider_class_name -providerArg provider_arg -v -protected -Jjavaoption 

这是-certreq的示例:


 "C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -certreq -alias testkey -keypass 123456 -storetype JKS -keystore keystore.jks -storepass abcdef -file certreq.certreq 

该命令将为以别名testkey保存在keystore.jks文件中的keystore.jks生成证书请求,并将证书请求写入名为certreq.certreq的文件中。


Keytool实用程序参数


以下是各种keytool命令keytool的参数列表。 请记住,并非所有团队都接受所有这些论点。 查看特定的命令以查看需要什么参数。


  • -alias条目的别名。 记住别名
    只能指向一个键。
  • -keyalg用于生成密钥的算法的名称。 常用的RSA。
  • -keysize密钥大小(以位为单位)。 通常,密钥大小为多个。 另外,各种算法只能支持某些预定义的密钥大小。
  • -sigalg用于对密钥对进行签名的签名算法。
  • -dname X.500标准中的唯一名称。 此名称将与
    密钥库中此密钥对的别名,也
    在自签名中用作字段“发出者”和“主题”
    证书。
  • -keypass所需的密钥对密码
    访问密钥库中的此特定密钥对。
  • -validity证书的天数
    附加在密钥对上的密码必须有效。
  • -storetype应当保存密钥库的文件格式。 默认值为JKS。 另一种选择是PKCS11格式。
  • -keystore用于存储生成的对的存储库文件的名称
    键。 如果文件不存在,将创建它。
  • -file读取或写入证书或请求证书的文件名。
  • -storepass密钥库中的密码,给想要工作的任何人
    使用它,您需要此密码。 storepasskeypass之间的区别
    第一个提供对存储库的访问,第二个提供对单独存储库的访问
    一对钥匙。 您将需要两个密码才能访问任何密钥,
    存储在存储中。
  • -rfc如果启用此标志,则该实用程序将使用文本格式而不是二进制格式,例如,用于导出或导入证书。 -Rfc值
    参考RFC 1421
  • -providerName创建密钥对时要使用的加密API提供程序的名称。 提供程序名称必须在Java安全属性文件中指定。
  • -providerClass您要使用的加密API提供程序的根类的名称。 在Java安全属性文件中未指定提供者名称时使用。
  • -providerArg初始化期间传递给自己的密码提供程序的参数(如果提供程序有必要)。
  • -v是冗长的缩写,Keytool将以可读格式将许多其他信息打印到命令行。
  • -protected确定是否应通过某种外部机制(例如,硬件令牌)提供密钥库密码。 有效值为true和false。
  • -Jjavaoption Java VM -Jjavaoption选项字符串,它生成密钥对并创建存储。

Source: https://habr.com/ru/post/zh-CN446322/


All Articles