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`)。