使用keytool生成秘钥对

keytool工具位于%JAVA_HOME%/bin,我之前从来没有意识到过这个工具的存在,最近在进行CAS相关的实验,发现了这个工具。按照书中的提示进行了实验,将实验过程整理如下:

制作本地秘钥库

用如下指令生成本地秘钥库


keytool -genkey -alias casserver -keyalg RSA -keystore D:\keystore

在交互的过程中会涉及两个口令:密钥库口令和密钥口令。如果在生成秘钥时,keystore参数指定的秘钥库已经存在,那么新生成的秘钥会添加到该密钥库,否则将生成一个新的密钥库用于存放新生成的密钥。所以,当指定的密钥库已经存在时,必须填写密钥库的口令;如果密钥库不存在,则可以设定一个新的口令。

您的名字与姓式是什么一项,应当填写CAS Server的域名,否则在后续的单点登录过程中会遇到问题。如果只是用于本地开发测试,则域名可以随意填写,并通过配置hosts的方式使其生效。其他参数可以根据个人情况填写,或者直接跳过。制作成功之后就可以在对应的路径下找到密钥库了。

其他操作

删除一个entry

从一个keystore中删除某个entry:


keytool -delete -alias tomcat5 -keystore D:\keystore

生成一个证书

生成一个自签名的证书:


keytool -genkey \
    -dname "CN=fingki,OU=server,O=server,L=bj,ST=bj,C=CN" \
    -alias myca \
    -keyalg RSA \
    -keysize 1024 \
    -keystore D:\keystore \
    -keypass 654321
    -storepass 123456
    -validity 3650

修改密码

修改密码:


keytool -genkey -alias duke -keypass dukekeypasswd -keystore D:\keystore
keytool -keypasswd -alias duke -keypass dukekeypasswd -new newpass -keystore D:\keystore

查看一个keystore中的所有条目


keytool -list -v -keystore D:\keystore

将keystore中的某条entry导出到一个文件


keytool -export -alias duke -keystore D:\keystore -rfc -file testkey

# 将证书库monitor.keystore中的别名为monitor的证书导出到monitor.cer证书文件中
# 它包含证书主体的信息及证书的公钥,不包括私钥,可以公开

kektool -export -alias monitor -keystore monitor.keystore -file monitor.cer

输入证书到一个新的truststore


# 我觉得这个指令应该是将文件中的证书导入到keystore中
keytool -import -alias dukecert -keystore truststore -file testkey

# 想Java默认证书中导入Rapa.cert
keytool -import -alias RapaServer -keystore cacerts -file Rapa.cert

其他概念

签署

服务器产生了一个证书之后,用这个证书签署Applet等,以表明这个Applet确实是来源于这个服务器,而不是其他,以实现其真实性,如果你信任这个服务器,那么你就可以信任这个Applet。比如你可以通过jarsigner工具,用keystore中的某个key entry来签署一个jar文件(这个操作我还未进行过)。

keytool

Keytool可以用来创建数字证书,所有的数字证书是以一条一条(采用别名区分)的形式存入证书库中,证书库中的一条证书包含该证书的私钥、公钥和对应的数字证书的信息。证书的一条证书可以导出数字证书文件,数字证书文件只包含主体信息和对应的公钥。

Keytool把要是和证书存储到一个keystore中,keystore默认的实现是一个文件,用一个密码保护秘钥(和上面的知识开始印证起来了)。

证书

一个证书是一个实体的数字签名,还包含这个实体的公共秘钥值。

公共钥匙:是一个详细的实体的数字关联,并有意让所有想通这个实体发生信任关系的其他实体知道,公共钥匙是用来校验签名的。

数字签名:是实体信息用实体的私有秘钥签名(加密)后的数据,这条数据可以用这个实体的公共钥匙来检验签名(解密)出实体信息,以鉴别实体的身份(目前是谁拿到了这个证书都可以校验实体是不是自己想要的)。

私有钥匙:是一些数字,私有和共有钥匙存在所有用公共秘钥加密的系统的钥匙对中。公共钥匙用来加密数据、私有钥匙用来计算签名,公钥加密的信息,只能用私钥解密。私钥签名的消息只能用公钥检验签名。

实体:一个实体可以是一个人、一个组织、一个程序、一台计算机、一个商业、一个银行,或其他你想信任的东西。

keystore

所有的keystore entry(钥匙和信任证书入口)是通过唯一的别名访问的,别名不区分大小写。可以在使用-genkey参数的时候指定别名,也可以使用-import参数加一个证书或证书链到信任证书(这个又是什么概念)。

keystore和truststore区别

一个web应用如果需要走https协议,需要一个数字证书,这个证书的配置是在apache的配置文件或者其他web容器的配置文件中进行配置。当然这个可以保存在keystore中。

keystore和truststore主要是针对应用本身的需求来的,keystore和truststore从其文件格式来看其实是一个东西,只是为了方便管理将其分开。keystore中一般保存的是我们的私钥,用来加密或者为别人做签名。truststore中保存的是一些可信任的证书,主要是java在代码中访问某个https的时候对访问者进行认证的,以确保其是可信任的(好奇怪的说,访问某个https的时候,对访问这进行认证,应该是被访问者吧)。

truststore是必须的,如果我们没有显示地指定,那么java会默认指定为$JAVA_HOME/lib/security/cacerts这个文件(这个知识我也是第一次接触)。可以在java的参数中进行指定:


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

参考资料

  1. Keystore密钥库