文章目录
- 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