10.3 证书管理

任何机构或个人都可以申请数字证书,并使用由CA机构颁发的数字证书为自己的应用保驾护航。

要获得数字证书,我们需要使用数字证书管理工具(如KeyTool和OpenSSL)构建CSR(Certificate Signing Request,数字证书签发申请),交由CA机构签发,形成最终的数字证书。

本文以Windows操作系统操作KeyTool和OpenSSL为例,演示证书管理的相关操作。获得数字证书后,我们可以使用数字证书提供的算法进行相应实现。

10.3.1 KeyTool证书管理

KeyTool是Java中的数字证书管理工具,用于数字证书的申请、导入、导出和撤销等操作。有关Java 6下的KeyTool命令参见http://java.sun.com/javase/6/docs/technotes/tools/solaris/keytool.html。

KeyTool与本地密钥库相关联,将私钥存于密钥库,公钥则以数字证书输出。KeyTool位于%JDK_HOME%\bin目录中,需要通过命令行进行相应的操作。

1.构建自签名证书

申请数字证书之前,需要在密钥库中以别名的方式生成本地数字证书,建立相应的加密算法、密钥、有效期等信息,同时需要提供用户身份信息,我们可以为自己签发一个数字证书(即自签名证书)。

这里我们使用“www.zlex.org”作为别名,使用RSA作为加密算法,并规定密钥长度为2048位,使用SHA1withRSA作为数字签名算法,欲签发有效期为36000天的数字证书。完整的命令如代码清单10-1所示。

代码清单10-1 生成本地数字证书1


keytool-genkeypair-keyalg RSA-keysize 2048-sigalg SHA1withRSA-validity 36000-alias www.zlex.org-keystore zlex.keystore


各参数的含义如下所示:

-genkeypair 表示生成密钥。

-keyalg 指定密钥算法,这里指定为RSA算法。

-keysize 指定密钥长度,默认1024位,这里指定为2048位。

-sigalg 指定数字签名算法,这里指定为SHA1withRSA算法。

-validity 指定证书有效期,这里指定为36000天。

-alias 指定别名,这里是www.zlex.org。

-keystore 指定密钥库存储位置,这里是zlex.keystore。

KeyTool工具支持RSA和DSA共2种算法,且DSA算法为默认算法。

执行上述命令后,可按相应的示输入用户的相关信息,如图10-7所示。

figure_0351_0085

图 10-7 生成本地数字证书

这里我们输入密码“123456”,也可通过参数“-storepass”指定密码“123456”。以“www.zlex.org”作为用户的姓名。这里的用户并不是指代现实意义中的用户个体,而是指代网络环境中的用户个体。因此,通常使用域名或带有通配符“”的泛域名,如“.zlex.org”标识用户身份。

我们可以使用参数-dname指定用户信息,代替上述手动输入用户信息。完整的命令如代码清单10-2所示。

代码清单10-2 生成本地数字证书2


keytool-genkeypair-keyalg RSA-keysize 2048-sigalg SHA1withRSA-validity 36000-alias www.zlex.org-keystore zlex.keystore-dname"CN=www.zlex.org, OU=zlex, O=zlex, L=BJ, ST=BJ, C=CN"


经过上述操作后,密钥库中已经创建了数字证书。虽然这时的数字证书并没有经过CA认证,但并不影响我们使用。

我们仍可以将数字证书导出,发送给合作伙伴进行加密交互。完整命令如代码清单10-3所示。

代码清单10-3 导出数字证书


keytool-exportcert-alias www.zlex.org-keystore zlex.keystore-file zlex.cer-rfc


各参数的含义如下所示:

-exportcert 表示证书导出操作。

-alias 指定导别名,这里为www.zlex.org。

-keystore 指定密钥库文件,这里为zlex.keystore。

-file 指定导出文件路径,这里为zlex.cer。

-rfc 指定以Base64编码格式输出。

这里我们输入密码“123456”,也可通过参数“-storepass”指定密码“123456”,将获得数字证书文件“zlex.cer”。

执行上述命令后,操作结果如图10-8所示。

figure_0352_0086

图 10-8 导出数字证书

我们可以通过相应的命令在控制台打印数字证书的信息,命令如代码清单10-4所示。

代码清单10-4 打印数字证书


keytool-printcert-file zlex.cer


控制台打印数字证书信息如图10-9所示。

figure_0352_0087

图 10-9 打印数字证书

这里通过KeyTool工具直接导出的证书,是一个自签名的X.509第三版类型的根证书,并以Base64编码保存。自签名证书虽然可以使用,但未经过CA机构认证,几乎没有任何法律效力。

在使用自签名证书时,我们需要将其导入系统。

2.构建CA签发证书

如果要获取CA机构认证的数字证书,需要将数字证书签发申请(CSR)导出,经由CA机构认证并颁发,同时将认证后的证书导入本地密钥库和信任库。

导出数字证书签发申请操作,如代码清单10-5所示。

代码清单10-5 导出数字证书签发申请


keytool-certreq-alias www.zlex.org-keystore zlex.keystore-file zlex.csr-v


各参数的含义如下所示:

-certreq 表示数字证书申请操作。

-alias 指定别名,这里为www.zlex.org。

-keystore指定密钥库文件,这里为zlex.keystore。

-file 指定导出文件路径,这里为zlex.csr。

-v 详细信息。

这里我们输入密码“123456”,也可通过参数“-storepass”指定密码“123456”。

执行上述命令后,将得到一个PKCS#10编码格式的数字证书签发申请文件,即文件“zlex.csr”,操作结果如图10-10所示。

figure_0353_0088

图 10-10 导出数字证书签发申请

目前,由VeriSign(http://www.verisign.com/)、GeoTrust(http://www.geotrust.com/)和Thawte(http://www.thawte.com/)国际权威数字证书颁发认证机构“三巨头”签发的数字证书价格不菲,但这三大认证机构几乎都提供了用于测试的数字证书,读者朋友可以提交CSR文件内容,获得相应的签发数字证书。这些用于测试的数字证书通常在时效上扩展功能等方面有限制。

当然,我们可以使用免费的国际权威数字证书颁发认证机构签发数字证书,如CAcert(http://www.cacert.org/)。

获得签发后的数字证书后,需要将其导入信任库。导入数字证书操作,如代码清单10-6所示。

代码清单10-6 导入数字证书


keytool-importcert-trustcacerts-alias www.zlex.org-file zlex.cer-keystore zlex.keystore


各参数的含义如下所示:

-importcert 表示导入数字证书。

-trustcacerts 表示将数字证书导入信任库。

-alias 指定导别名,这里为www.zlex.org。

-file 指定导入数字证书文件路径,这里为zlex.cer。

-keystore 指定密钥库文件,这里为zlex.keystore。

这里我们输入密码“123456”,也可通过参数“-storepass”指定密码“123456”,并输入“Y”确认导入该证书。本文以自签名证书导入为例,执行上述命令操作的结果如图10-11所示。

导入证书后,我们可以通过相关命令查看该证书,命令如代码清单10-7所示。

代码清单10-7 查看导入数字证书


keytool-list-alias www.zlex.org-keystore zlex.keystore


各参数的含义如下所示:

-list 表示导入数字证书。

-alias 指定别名,这里为www.zlex.org。

-keystore 指定密钥库文件,这里为zlex.keystore。

这里我们输入密码“123456”,也可通过参数“-storepass”指定密码“123456”。

执行上述命令操作的结果如图10-12所示。

我们也可以加入参数“-v”或“-rfc”查看该证书的详细信息。

完成上述操作后,我们需要使用证书导出命令导出数字证书(见代码清单10-3),并将其发放给合作伙伴使用。

figure_0354_0089

图 10-11 导入数字证书

figure_0354_0090

图 10-12 查看导入数字证书