JavaKeytoolEssentials:使用Java密钥库
介绍
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 的帮助,请遵循 本指南 。