Keytool 是 Java 环境下用于管理密钥库(keystore)和SSL证书的核心命令行工具。可以使用它来查看证书信息、导入信任的证书,以及执行生成密钥对、导出证书等多种管理任务。
以下是基于官方文档和最佳实践整理的 Keytool 命令大全与操作手册。
一、Keytool 核心命令速览
Keytool 的所有命令和选项前都带有连字符(`-`),且一次只能执行一个命令。以下是按功能分类的常用命令:
功能分类 命令 描述
查看证书 `-list` | 查看密钥库中的条目列表。
`-printcert` 打印证书文件的内容(无需密钥库)。
导入证书 `-importcert` 将证书或证书链导入密钥库。
`-importkeystore` | 将整个密钥库的内容导入到另一个密钥库。
导出证书 `-exportcert` 从密钥库中导出证书。
生成操作 `-genkeypair` 生成密钥对(公钥和私钥)并存入密钥库。
`-certreq` 生成证书签名请求(CSR),用于向CA申请签名。
管理维护 `-delete` 删除密钥库中的某个条目。
`-changealias` 更改条目的别名。
`-keypasswd` 修改密钥的密码。
`-storepasswd` 修改密钥库的存储密码。
二、查看证书信息
1. 查看密钥库(Keystore)内容
如果你想查看一个已有的密钥库(如JDK自带的 `cacerts` 信任库)中包含了哪些证书,可以使用 `-list` 命令。添加 `-v` 选项可以查看详细的证书指纹等信息。
bash
keytool -list -v -keystore /path/to/your/keystore.jks
提示:JDK 默认的信任库文件位于 `$JAVA_HOME/lib/security/cacerts`,默认密码通常是 `changeit`。
2. 查看单独的证书文件
如果你有一个证书文件(例如从浏览器导出的 `.crt` 或 `.cer` 文件),想直接查看其内容,可以用 `-printcert` 命令。
bash
keytool -printcert -file your_certificate.crt
执行后,你会看到证书的所有者、颁发者、序列号、有效期以及公钥等关键信息。
三、导入证书到密钥库
当你的Java应用需要信任一个非权威机构签发的证书(如自签名证书或公司内部CA证书)时,需要将其导入到信任库中。
1. 导入单个证书文件
这是最常见的操作,使用 `-importcert` 命令。
bash
keytool -importcert -alias your_alias -file certificate.crt -keystore /path/to/keystore.jks
`-alias`:为导入的证书指定一个唯一的名字,方便日后管理。
`-file`:要导入的证书文件路径。
`-keystore`:目标密钥库的路径。如果文件不存在,该命令会创建一个新的密钥库。
`-trustcacerts`:可选参数,声明这是一个受信任的CA证书,通常建议加上。
执行过程:命令执行后,系统会提示你输入密钥库密码,并显示证书的详细信息,最后询问你是否信任此证书,输入 `yes` 即可完成导入。
2. 导入包含私钥的证书(PKCS12格式)
Keytool 无法直接导入一个单独的私钥文件。如果你有私钥(`.key`)和证书(`.crt`),需要先用 OpenSSL 工具将它们打包成一个 PKCS12 文件(`.p12`),然后再用 `-importkeystore` 命令导入。
bash
第一步:使用 OpenSSL 创建 PKCS12 文件
openssl pkcs12 -export -in your_certificate.crt -inkey your_private.key -name your_alias -out certificate.p12
第二步:使用 keytool 导入 PKCS12 文件到目标密钥库
keytool -importkeystore -deststorepass new_keystore_password -destkeystore destination.jks -srckeystore certificate.p12 -srcstoretype PKCS12
四、其他常用管理命令
删除证书
如果要移除一个已导入的证书,使用 `-delete` 命令:
bash
keytool -delete -alias your_alias -keystore /path/to/keystore.jks
导出证书
如果想从密钥库中导出一个证书到文件,使用 `-exportcert` 命令:
bash
keytool -exportcert -alias your_alias -file exported_cert.crt -keystore /path/to/keystore.jks
生成密钥对
在需要为应用服务器(如Tomcat)配置HTTPS时,首先生成密钥对:
bash
keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -keystore keystore.jks -dname "CN=yourdomain.com, OU=IT, O=Company, L=City, C=CN"
五、常见问题与解决方案
问题:证书导入失败,提示 "alias <mycert> already exists"
原因:密钥库中已经存在一个同别名的证书。
解决:要么使用 `-delete` 命令删除旧的别名,要么在导入时换一个新的 `-alias`。
问题:Java应用仍报错 "PKIX path building failed"
原因:证书虽然导入了,但可能没有生效,或者导入的证书链不完整。
解决:
1. 确保你导入的是正确的证书,且包含了完整的证书链(根证书和中间证书)。
2. 修改了JDK的 `cacerts` 文件后,需要**重启**你的Java应用以使更改生效。
问题:如何在不修改全局 cacerts 的情况下使用自己的信任库?
解决:你可以在启动Java应用时,通过JVM参数指定自定义的信任库路径和密码,这样就不会影响系统全局设置。
bash
java -Djavax.net.ssl.trustStore=/path/to/your/custom_truststore.jks -Djavax.net.ssl.trustStorePassword=your_password YourApplication
六、常用选项速查表
选项 描述
`-keystore <file>` 指定密钥库文件的路径。
`-storepass <password>` 指定密钥库的密码。
`-alias <name>` 指定条目的别名。
`-file <filename>` 指定输入或输出的证书文件。
`-v` 启用详细输出,显示更详细的信息。
`-trustcacerts` 导入时,将证书视为受信的CA证书。
`-storetype <type>` 指定密钥库的类型(如 `JKS`, `PKCS12`)。