文章目录

  • Java keytool 是如何工作的
  • 添加证书到 keystore
  • 列出 keystore 中的证书
  • 从 keystore 导出证书
  • 查看证书的更多信息
  • 将该证书从 keystore 移除
  • 非交互模式 (keytool 命令不询问)



Java 的 keytool 工具可以用于 https 连接,能够只允许经过授权的客户访问。任意工具或者 Java 代码都可以使用一个安装好的证书来访问服务器。

Java keytool 是如何工作的

也许你想让你的服务器可以公开访问,但仅限于特定的团队或组织。
或者你为企业构建了一个基础设施并希望它是安全的。在这种情况下你就需要一些手段来控制谁可以使用特定的服务了。
诸如此类的资源应该保护起来以免受未经授权的使用,服务器和授权用户之间的通道必须是安全的。
Java keytool 允许我们给指定的 Java 客户端颁发证书以使其能够通过 https 来使用特定的服务器。这是一个完善的并易于使用的 Java 标准。
要获得使用特定服务的认证,客户端需要完成以下操作:
拿到服务端所期望的证书 (.crt 文件)。你可以向管理员要一下这个证书。

  • 将其添加到你的秘钥环:
keytool -import
  • 检查自定义的客户端工具的详细配置,如果有的话。

添加证书到 keystore

假定:

  • my.cert.location/my.cert.crt - 要安装的证书
  • “changeit” - 默认的 keystore 密码 (如果你没有设置过的话,java 给出的默认值就是这个)
  • 默认的 java keystore 位置 - $JAVA_HOME/jre/lib/security/cacerts
    将该证书添加到默认的 java 密钥环
keytool -import -file my.cert.location/my.cert.crt -storepass changeit -keystore $JAVA_HOME/jre/lib/security/cacerts -alias mycert1

要确认时回答 ‘yes’

列出 keystore 中的证书

列出 keystore 中的证书:

keytool -list -storepass changeit -keystore /opt/java/jre/lib/security/cacerts

输出类似于以下:

mycert1, May 10, 2010, trustedCertEntry,Certificate fingerprint (MD5): CA:3D:D3:68:F1:03:5C:D0:32:FA:B8:2B:59:E8:5A:DB verisigntsaca, Aug 13, 2008, trustedCertEntry,Certificate fingerprint (MD5): 7F:66:7A:71:D3:EB:69:78:20:9A:51:14:9D:83:DA:20 baltimorecodesigningca, May 10, 2002, trustedCertEntry,Certificate fingerprint (MD5): 90:F5:28:49:56:D1:5D:2C:B0:53:D4:4B:EF:6F:90:22

其中比较重要的部分为证书的别名 **alias**。你可以使用别名 **alias** 对证书进行导入和导出操作。

在 keystore 中,证书的唯一标识或者名字被称为别名 alias

要确认别名 alias 为 mykeylis 的证书是否已导入,使用:

keytool -list -storepass changeit -keystore /opt/java/jre/lib/security/cacerts |grep mykey1 -A1

以上命令将列出该证书所有的相关信息。
如果服务器没有找到该证书的话会给出以下信息:

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

给出一台正常连接的客户端和一台无法连接到服务器的客户端,你可以通过以下方法去排查问题:

  • 对比各自证书的 MD5
  • 检查证书是否已安装
  • 导入缺失的证书
  • 打印证书内容

从 keystore 导出证书

keytool -exportcert -storepass changeit -keystore $JAVA_HOME/jre/lib/security/cacerts -alias mycert1 > my.cert.location/my.cert.1.crt

my.cert.1.crt 将被导重新导入到另一个秘钥环。

查看证书的更多信息

备注:示例使用上文已导出的同一个证书。

查看该证书的所有者、组织等信息可以使用以下命令:

keytool -printcert -file mycert.crt

将该证书从 keystore 移除

keytool -delete -storepass changeit -keystore $JAVA_HOME/jre/lib/security/cacerts -alias mycert1

非交互模式 (keytool 命令不询问)

这在 bash 脚本中很有用。使用 -noprompt 选项:

keytool -delete -storepass changeit -keystore $JAVA_HOME/jre/lib/security/cacerts -alias mycert1 -noprompt