Keystore密钥库

 

单点登录项目中的数字证书管理——keystore 与 keytool 详解

近来由于项目需要实现 Single Sign On(SSO),我们在研究 CAS(Central Authentication Service)配置时发现,最关键的不在于 CAS 本身,而在于数字证书的配置。多台服务器之间建立信任关系,核心就在于如何管理和使用数字证书。本文将详细介绍 keystore、keytool 以及相关概念和常用操作,帮助大家理解并实践数字证书管理。


一、基本概念

1.1 keystore

  • 定义:keystore 是一个受密码保护的文件,用于存储密钥和证书。

  • 存储内容:包含两类条目(entries):

    • 私钥和对应的数字证书:用于签名和加密解密

    • 受信任的证书:仅包含公钥,用于建立信任链

  • 默认位置:一般位于当前登录用户的 home 目录;若未指定,则默认使用 home 目录下的 keystore 文件。

  • 检索与查看

    • 使用 -alias 参数可以检索 keystore 中具体的条目。

    • 使用 -v(verbose)参数可以显示条目的详细信息(例如签发者、有效期等)。

注意:JDK/jre/lib/security 目录下的 cacerts 文件就是一个 keystore,默认密码为 changeit。当一个应用服务器需要与其他服务器建立安全连接时,其受信任的数字证书通常会存储在 cacerts 中。


1.2 keytool

  • 定义:keytool 是 Java 提供的一个管理数字证书和密钥的工具。

  • 功能

    • 导入:将证书或证书链导入到 keystore 中

    • 导出:从 keystore 中导出数字证书(导出的文件中只包含公钥和主体信息)

    • 列举:列出 keystore 中所有条目的详细信息

    • 删除:删除 keystore 中指定别名(alias)的条目

    • 生成自签名证书:用于测试或内部使用,可通过生成密钥对和数字证书来证明实体身份

  • 执行位置:通常位于 JDK 的 bin 目录下(如 keytool.exe)。


二、数字证书与密钥的基本操作

在了解了 keystore 与 keytool 的概念后,下面通过几个常见的操作命令来展示如何使用 keytool 管理数字证书。

2.1 删除 keystore 中的条目

假设有一个 keystore 文件位于 home 目录中,条目别名为 tomcat5,删除命令为:

keytool -keystore .keystore -delete -alias tomcat5

这个命令会从指定的 keystore 中删除别名为 tomcat5 的条目。


2.2 生成自签名证书

生成自签名证书时,可以指定各种参数,如实体信息、别名、密码、密钥算法及有效期。例如,下面命令生成别名为 myCA 的证书,并存储在名为 myCALib 的 keystore 中:

keytool -genkey -dname "CN=fingki,OU=server,O=server,L=bj,ST=bj,C=CN" -alias myCA -keyalg RSA -keysize 1024 -keystore myCALib -keypass 654321 -storepass 123456 -validity 3650
  • 参数说明

    • -dname:指定证书中的实体信息,如姓名、组织、城市、州、国家等

    • -alias:指定条目别名

    • -keyalg-keysize:指定密钥算法及密钥长度

    • -keystore:指定 keystore 文件名称(如文件不存在则自动生成)

    • -keypass-storepass:分别指定密钥和 keystore 的密码

    • -validity:证书有效期(单位:天)


2.3 列出和查看 keystore 内容

  • 列出所有条目

keytool -list -v -keystore keystore文件路径

执行时会要求输入 keystore 密码,之后将显示所有条目的详细信息,包括条目的类型、创建日期、签发者、有效期、指纹信息等。


2.4 导出证书

可以将 keystore 中某个条目的证书导出为文件,例如将别名为 monitor 的证书导出到 monitor.cer 文件中:

keytool -export -alias monitor -keystore monitor.keystore -file monitor.cer -rfc

其中,-rfc 参数指定以可查看编码的方式输出证书(即 PEM 格式)。


2.5 导入证书到 keystore

若需要将一个证书文件导入到指定的 keystore(比如信任库 truststore)中,可以使用如下命令:

keytool -import -alias myCA -file myCA.cer -keystore truststore

truststore 不存在,将自动创建;过程中会要求设置 keystore 密码。


2.6 修改证书条目的密码

如果需要修改某个条目的口令,可以使用以下命令:

keytool -keypasswd -alias myCA -keypass 原口令 -new 新口令 -storepass keystore密码 -keystore myCALib

2.7 修改 keystore 密码

更新整个 keystore 的密码,命令如下:

keytool -storepasswd -new 新密码 -storepass 旧密码 -keystore truststore

三、概念深入解析

3.1 签署与验证

  • 签署:服务器使用自身生成的私钥对某个数据(如 Applet、jar 文件)进行签名,以证明该数据确实来源于该服务器。如果客户端信任该服务器的数字证书,则可以信任由其签名的数据。

  • 验证:通过公钥对签名进行验证,从而确保数据未被篡改,并且确实由持有对应私钥的实体发出。

3.2 keystore 与 truststore 的区别

虽然从文件格式上看,keystore 与 truststore 实际上都是存放密钥和证书的仓库,但它们的用途略有不同:

  • keystore

    • 存储的是私钥和对应的数字证书

    • 用于服务器对外进行加密、签名或建立安全连接时提供身份验证

  • truststore

    • 存储的是只包含公钥的受信任证书

    • 用于客户端验证服务器身份,如访问 HTTPS 服务时验证对方的证书是否受信任

    • 默认情况下,Java 会使用 $JAVA_HOME/lib/security/cacerts 作为 truststore,其默认密码为 changeit

在应用服务器中,如果需要建立安全链接,可以在配置中显式指定 keystore 和 truststore 路径及密码,例如:

-Djavax.net.ssl.keyStore=clientKeys
-Djavax.net.ssl.keyStorePassword=password
-Djavax.net.ssl.trustStore=clientTrust
-Djavax.net.ssl.trustStorePassword=password

四、实例与实践

下面以一个实例说明如何操作:

  1. 生成新密钥对并存储到 keystore
    命令示例(在 Windows 环境下):

    keytool -genkey -alias jason -keystore jServer.keystore -keyalg RSA
    
    • 系统提示输入 keystore 密码(建议不少于6个字符)

    • 接着依次输入实体信息(姓名、组织、城市、州、国家代码)

    • 最后输入密钥口令(可以与 keystore 密码相同或不同)

  2. 查看生成的证书信息

    keytool -list -v -keystore jServer.keystore
    

    输入 keystore 密码后,可以看到条目 jason 的详细信息,包括创建日期、认证链信息、指纹等。

  3. 删除 keystore 中的某个条目

    keytool -delete -alias jason -keystore jServer.keystore
    
  4. 导出证书到文件

    keytool -export -alias myCA -file myCA.cer -keystore myCALib -storepass 123456 -rfc
    
  5. 导入证书到新的 truststore

    keytool -import -alias myCA -file myCA.cer -keystore truststore
    
  6. 修改 keystore 的密码

    keytool -storepasswd -new newpass -storepass 789012 -keystore truststore
    

五、在 Web 服务器中的应用配置

在实际应用中,例如 Tomcat 或 Apache,都需要配置数字证书和密钥库以支持 HTTPS 通信。下面是 Tomcat 的示例配置片段:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
           maxHttpHeaderSize="8192" algorithm="IbmX509"
           enableLookups="false" disableUploadTimeout="true"
           acceptCount="100" scheme="https" secure="true"
           clientAuth="false" sslProtocol="SSL_TLS"
           keystoreFile="C:\Path\to\buildForgeKeyStore.p12"
           keystorePass="qqqqqq"
           keystoreType="PKCS12"
           truststoreFile="C:\Path\to\buildForgeTrustStore.p12"
           truststorePass="qqqqqq"
           ciphers="..."
           truststoreType="PKCS12" />

在 Apache 中也类似,需要指定证书文件、私钥文件以及 CA 文件,确保服务器间信任关系正确建立。


六、总结

在单点登录和安全通信中,数字证书起着至关重要的作用。通过对 keystore 和 keytool 的了解与操作,可以完成以下任务:

  • 管理和存储密钥、证书和受信任的数字证书

  • 生成自签名证书或导入受信任的证书

  • 配置服务器之间的信任链,确保安全的 HTTPS 及其他加密通信

本文详细介绍了 keystore、keytool 的基本概念、常用命令及实例操作,希望能帮助大家在 CAS 及 SSO 项目中正确配置数字证书,建立起多台服务器之间的安全信任连接。


如有任何疑问或进一步讨论,欢迎在评论区留言交流。

 

感谢您的来访,获取更多精彩文章请收藏。

THE END
点赞5 分享