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 可能需要的 rootintermediate 证书来完成信任链。 只需指定一个唯一别名,例如 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 的帮助,请遵循 本指南