单点登录项目中的数字证书管理——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
四、实例与实践
下面以一个实例说明如何操作:
-
生成新密钥对并存储到 keystore
命令示例(在 Windows 环境下):keytool -genkey -alias jason -keystore jServer.keystore -keyalg RSA
-
系统提示输入 keystore 密码(建议不少于6个字符)
-
接着依次输入实体信息(姓名、组织、城市、州、国家代码)
-
最后输入密钥口令(可以与 keystore 密码相同或不同)
-
-
查看生成的证书信息
keytool -list -v -keystore jServer.keystore
输入 keystore 密码后,可以看到条目
jason
的详细信息,包括创建日期、认证链信息、指纹等。 -
删除 keystore 中的某个条目
keytool -delete -alias jason -keystore jServer.keystore
-
导出证书到文件
keytool -export -alias myCA -file myCA.cer -keystore myCALib -storepass 123456 -rfc
-
导入证书到新的 truststore
keytool -import -alias myCA -file myCA.cer -keystore truststore
-
修改 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 项目中正确配置数字证书,建立起多台服务器之间的安全信任连接。
如有任何疑问或进一步讨论,欢迎在评论区留言交流。
感谢您的来访,获取更多精彩文章请收藏。
