Java Keytool

时间:2020-01-09 10:35:54  来源:igfitidea点击:

Java Keytool是一个命令行工具,可以生成公用密钥/专用密钥对并将其存储在Java KeyStore中。 Keytool可执行文件随Java SDK(或者JRE)一起分发,因此,如果安装了SDK,则还将具有Keytool可执行文件。

Keytool可执行文件称为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支持一组与密钥,证书和密钥存储一起使用的命令。本Java Keytool教程将介绍这些命令中最常用的。

键盘工具脚本

Keytool命令带有很多参数,可能很难记住正确设置它们。因此,最好其中包含Keytool命令的情况下创建一些Keytool CMD或者Shell脚本。这些脚本使以后重新执行keytool命令更容易,并且可以稍后再查看如何生成KeyStore。 。

生成密钥对

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

-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参数"部分中进行了说明。并非所有这些论点都是必需的。许多是可选的。 Keytool会告诉我们是否缺少必需的参数。

换行符不应包含在最终命令中。换行仅是为了使命令格式在此处更易于阅读。

这是一个示例keytool -genkeypair命令。请记住在尝试之前删除换行符!

"C:\Program Files\Java\jdk1.8.0_111\bin\keytool" -genkeypair
    -alias testkey
    -keyalg RSA
    -keysize 2048
    -dname "CN=Hyman, OU=Hyman Aps, O=Hyman Aps, L=Copenhagen, ST=Unknown, C=DK"
    -keypass 123456
    -validity 100
    -storetype JKS
    -keystore keystore.jks
    -storepass abcdef

出口证明书

Java Keytool也可以导出存储在KeyStore中的证书。这是Keytool命令查找导出证书的方式:

-exportcert
    -alias alias
    -file cert_file
    -storetype storetype
    -keystore keystore
    -storepass storepass
    -providerName provider_name
    -providerClass provider_class_name
    -providerArg provider_arg
    -rfc
    -v
    -protected
    -Jjavaoption

参数在" Keytool参数"部分中进行了说明。并非所有这些论点都是必需的。许多是可选的。 Keytool会告诉我们是否缺少必需的参数。

这是一个Keytool命令示例,该示例导出密钥对的证书。在命令行上输入命令时,切记要删除换行符。

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

导入证书

Java Keytool也可以将证书导入KeyStore。这是Keytool命令查找导入证书的方式:

-importcert
    -alias alias
    -file cert_file
    -keypass keypass
    -noprompt
    -trustcacerts
    -storetype storetype
    -keystore keystore
    -storepass storepass
    -providerName provider_name
    -providerClass provider_class_name
    -providerArg provider_arg
    -v
    -protected
    -Jjavaoption

参数在" Keytool参数"部分中进行了说明。并非所有这些论点都是必需的。许多是可选的。 Keytool会告诉我们是否缺少必需的参数。

这是一个示例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

列出密钥库条目

要列出Java KeyStore中的条目,可以使用Keytool-list命令。这是Keytool-list命令的格式。换行仅是为了使命令格式更易于阅读。在运行命令之前,请删除换行符。

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

参数在" Keytool参数"部分中进行了说明。并非所有这些论点都是必需的。许多是可选的。 Keytool会告诉我们是否缺少必需的参数。

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

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

这个Keytool-list命令将列出给定KeyStore中的所有条目。运行此Keytool-list命令的输出将类似于以下内容:

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

testkey, 19-Dec-2016, PrivateKeyEntry,
Certificate fingerprint (SHA1): 4F:4C:E2:C5:DA:36:E6:A9:93:6F:10:36:9E:E5:E8:5A:6E:F2:11:16

如果我们在Keytool-list命令中包含-alias参数,那么只会列出与给定别名匹配的条目。这是一个带有-alias参数的示例Keytool-list命令:

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

运行上述Keytool-list命令的输出将类似于以下内容:

y -storetype JKS -keystore keystore.jks -storepass abcdef
testkey, 15-Dec-2016, 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具有一个可以删除Java KeyStore中的键条目的命令。用于删除密钥的Keytool命令是-delete。这是Keytool-delete命令的格式:

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

参数在" Keytool参数"部分中进行了说明。并非所有这些论点都是必需的。许多是可选的。 Keytool会告诉我们是否缺少必需的参数。

这是一个Keytool-delete命令示例。请记住在运行前删除换行符!

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

这个Keytool -delete命令将从存储在文件keystore.jks中的密钥库中删除别名为testkey的密钥库条目。

生成证书申请

Java Keytool可以使用-certreq命令生成一个证书请求。证书请求是对证书颁发机构(CA)创建组织的公共证书的请求。证书请求生成后,应将其发送到我们要为其创建证书的CA(例如Verisign,Thawte或者其他CA)。

在生成私钥,公钥对的证书请求之前,我们必须已将该私钥,公钥对生成到密钥库中(或者将其导入)。请参阅本Java Keytool教程中的其他内容,以了解如何执行此操作。

这是用于生成证书请求的命令格式。尝试此命令时,请记住删除所有换行符:

-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

参数在" Keytool参数"部分中进行了说明。并非所有这些论点都是必需的。许多是可选的。 Keytool会告诉我们是否缺少必需的参数。

这是一个Java Keytool-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

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

请记住,仅包含换行符以使命令更易于阅读。自己在命令行上键入命令时,请忽略它们。

键盘工具参数

以下是各种Keytool命令采用的参数列表。请记住,并非所有命令都接受所有这些参数。查看具体命令,以了解需要什么参数。

参数描述
-alias应当使用Java KeyStore中生成的密钥的名称来标识。请记住,
别名只能指向一个键。
-keyalg用于生成密钥的算法的名称。一个公共值是“ RSA”
,这意味着应该使用RSA算法来生成密钥对。
-keysize要生成的密钥的大小(以位为单位)。通常,密钥大小是8的倍数,它与多个字节对齐。此外,不同的算法可能仅支持特定的预设密钥大小。
我们将需要检查要生成的密钥的密钥大小。
-sigalg用于对密钥对进行签名的签名算法。
-dnameX.500标准的专有名称。该名称将与KeyStore中此密钥对的
别名相关联。 dname也用作自签名证书中的“发行人”和“主题”
字段。
-keypass访问密钥库中此特定密钥对所需的密钥对密码。
-validity添加在密钥对上的证书应该有效的天数。
-storetypeKeyStore的文件格式应该保存。默认值为“ JKS”。
另一个选项是值“ PKCS11”,它表示标准PKCS11格式。
-keystore用于存储生成的密钥对的KeyStore文件的名称。如果该文件不存在,将创建该文件。
-file要读取或者写入的文件的名称(证书或者证书请求)。
-storepass整个KeyStore的密码。想要以后打开此KeyStore的任何人
将需要此密码。 “ storepass”与“ keypass”不同。 “ keypass”
密码仅计入单个密钥。我们将需要KeyStore密码和密钥密码来访问
存储在KeyStore中的任何给定密钥。
-rfc如果包含此标志(它后面没有值),则Keytool将使用文本
格式,而不是二进制格式,例如用于出口或者进口证书。值-rfc表示
RFC 1421标准。
-providerName生成密钥对时要使用的加密API提供程序的名称(如果有)。必须在Java安全属性文件中列出提供程序名称,此名称才能起作用。
-providerClass要使用的加密API提供程序的根类的名称。
当提供程序名称未在Java安全属性文件中列出时,请使用此名称。
-providerArg自变量可以在初始化时传递给密码提供程序(如果提供程序需要,则由提供程序提供)。
-v“冗长”(?!?)的缩写,表示Keytool将以人类可读的格式在命令行中打印出许多额外的信息
-protected指定是否应通过某些外部
机制(例如读卡器)提供KeyStore密码。有效值为“ true”和“ false”。
-JjavaoptionJava选项字符串(Java VM选项),可以将其传递给Java VM
,该Java VM生成密钥对并创建KeyStore。