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所示。
图 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所示。
图 10-8 导出数字证书
我们可以通过相应的命令在控制台打印数字证书的信息,命令如代码清单10-4所示。
代码清单10-4 打印数字证书
keytool-printcert-file zlex.cer
控制台打印数字证书信息如图10-9所示。
图 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所示。
图 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),并将其发放给合作伙伴使用。
图 10-11 导入数字证书
图 10-12 查看导入数字证书