Java Keytool
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 | 用于对密钥对进行签名的签名算法。 |
-dname | X.500标准的专有名称。该名称将与KeyStore中此密钥对的 别名相关联。 dname也用作自签名证书中的“发行人”和“主题” 字段。 |
-keypass | 访问密钥库中此特定密钥对所需的密钥对密码。 |
-validity | 添加在密钥对上的证书应该有效的天数。 |
-storetype | KeyStore的文件格式应该保存。默认值为“ 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”。 |
-Jjavaoption | Java选项字符串(Java VM选项),可以将其传递给Java VM ,该Java VM生成密钥对并创建KeyStore。 |