介绍
Java Keytool 是用于操作 Java 密钥库的密钥和证书管理工具,它包含在 Java 中。 Java Keystore 是授权证书或公钥证书的容器,通常由基于 Java 的应用程序用于加密、身份验证和通过 HTTPS 提供服务。 它的条目受密钥库密码保护。 密钥库条目由 别名 标识,它由形成信任链的密钥和证书组成。
此备忘单样式指南提供了对使用 Java 密钥库时通常有用的 keytool
命令的快速参考。 这包括创建和修改 Java 密钥库,以便它们可以与您的 Java 应用程序一起使用。
如何使用本指南:
- 如果您不熟悉证书签名请求 (CSR),请阅读我们的 OpenSSL 备忘单 的 CSR 部分
- 本指南采用简单的备忘单格式——独立的命令行片段
- 跳转到与您尝试完成的任务相关的任何部分(提示:使用左下角的 Contents 菜单或浏览器的 Find 功能)
- 大多数命令是单行的,为了清楚起见,已扩展为多行(使用
\
符号)
创建和导入密钥库条目
本节介绍与生成密钥对和证书以及导入证书相关的 Java Keytool 命令。
在新的/现有的密钥库中生成密钥
如果您想使用 HTTP(HTTP over TLS)来保护您的 Java 应用程序,请使用此方法。 这将在新的或现有的 Java Keystore 中创建一个新的密钥对,可用于创建 CSR,并从证书颁发机构获取 SSL 证书。
此命令在指定的密钥库文件 (keystore.jks
) 中以指定的别名 (domain
) 生成 2048 位 RSA 密钥对:
keytool -genkeypair \ -alias domain \ -keyalg RSA \ -keystore keystore.jks
如果指定的密钥库不存在,它将在提供请求的信息后创建。 这将提示输入密钥库密码(新的或现有的),然后是专有名称提示(用于私钥),然后是所需的私钥密码。
为现有私钥生成 CSR
如果要生成可以发送给 CA 以请求颁发 CA 签名 SSL 证书的 CSR,请使用此方法。 它要求密钥库和别名已经存在; 您可以使用前面的命令来确保这一点。
此命令创建由 (keystore.jks
) 密钥库中别名 (domain
) 标识的私钥签名的 CSR (domain.csr
):
keytool -certreq \ -alias domain \ -file domain.csr \ -keystore keystore.jks
输入密钥库的密码后,将生成 CSR。
导入签名/根/中间证书
如果要导入签名证书,请使用此方法,例如 由 CA 签署的证书,放入您的密钥库; 它必须与指定别名中存在的私钥匹配。 您也可以使用相同的命令导入您的 CA 可能需要的 root 或 intermediate 证书来完成信任链。 只需指定一个唯一别名,例如 root
而不是 domain
,以及您要导入的证书。
此命令以指定的别名 (domain
) 将证书 (domain.crt
) 导入密钥库 (keystore.jks
)。 如果您要导入签名证书,它必须对应于指定别名中的私钥:
keytool -importcert \ -trustcacerts -file domain.crt \ -alias domain \ -keystore keystore.jks
系统将提示您输入密钥库密码,然后确认导入操作。
注意: 您也可以使用该命令将 CA 的证书导入您的 Java 信任库,假设 $JAVA_HOME
是安装 JRE 或 JDK 的位置,该信任库通常位于 $JAVA_HOME/jre/lib/security/cacerts
.
在新的/现有的密钥库中生成自签名证书
如果要为 Java 应用程序生成自签名证书,请使用此命令。 这实际上与用于创建新密钥对的命令相同,但以天为单位指定了有效期。
此命令在指定的密钥库文件 (keystore.jks
) 中以指定的别名 (domain
) 生成一个 2048 位 RSA 密钥对,有效期为 365
天:
keytool -genkey \ -alias domain \ -keyalg RSA \ -validity 365 \ -keystore keystore.jks
如果指定的密钥库不存在,它将在提供请求的信息后创建。 这将提示输入密钥库密码(新的或现有的),然后是专有名称提示(用于私钥),然后是所需的私钥密码。
查看密钥库条目
本节涵盖列出 Java 密钥库的内容,例如查看证书信息或导出证书。
列出密钥库证书指纹
此命令列出密钥库 (keystore.jks
) 中所有证书的 SHA 指纹,并在它们各自的别名下:
keytool -list \ -keystore keystore.jks
系统将提示您输入密钥库的密码。 您还可以使用 -alias domain
选项将输出限制为特定别名,其中“domain”是别名。
列出详细密钥库内容
此命令列出有关密钥库 (keystore.jks
) 包含的条目的详细信息,包括证书链长度、链中证书的指纹、可分辨名称、序列号和创建/到期日期,在它们各自的别名下:
keytool -list -v \ -keystore keystore.jks
系统将提示您输入密钥库的密码。 您还可以使用 -alias domain
选项将输出限制为特定别名,其中“domain”是别名。
注意: 您也可以使用此命令查看 Java 信任库中的证书,假设 $JAVA_HOME
是安装 JRE 或 JDK 的位置,该信任库通常位于 $JAVA_HOME/jre/lib/security/cacerts
.
使用 Keytool 查看证书信息
此命令打印有关证书文件 (certificate.crt
) 的详细信息,包括其指纹、所有者和颁发者的可分辨名称以及其有效期:
keytool -printcert \ -file domain.crt
系统将提示您输入密钥库密码。
出口证书
此命令在密钥库 (keystore.jks
) 中导出与别名 (domain
) 关联的二进制 DER 编码证书 (domain.der
):
keytool -exportcert -alias domain -file domain.der -keystore keystore.jks
系统将提示您输入密钥库密码。 如果您想将 DER 编码证书转换为 PEM 编码,请按照我们的 OpenSSL 备忘单。
修改密钥库
本节介绍 Java Keystore 条目的修改,例如删除或重命名别名。
更改密钥库密码
此命令用于更改密钥库 (keystore.jks
) 的密码:
keytool -storepasswd \ -keystore keystore.jks
系统将提示您输入当前密码,然后是新密码。 您也可以使用 -new newpass
选项在命令中指定新密码,其中“newpass”是密码。
删除别名
此命令用于删除密钥库 (keystore.jks
) 中的别名 (domain
):
keytool -delete \ -alias domain \ -keystore keystore.jks
系统将提示您输入密钥库密码。
重命名别名
此命令会将别名 (domain
) 重命名为密钥库 (keystore.jks
) 中的目标别名 (newdomain
):
keytool -changealias \ -alias domain \ -destalias newdomain \ -keystore keystore.jks
系统将提示您输入密钥库密码。
结论
这应该涵盖大多数人如何使用 Java Keytool 来操作他们的 Java Keystore。 它还有许多其他用途,此处未涵盖,因此请随时在评论中询问或建议其他用途。
本教程基于 Java 1.7.0 更新 65 附带的密钥库版本。 如需在 Ubuntu 上安装 Java 的帮助,请遵循 本指南 。