如果要启用SSL连接(参见2.2节https项)则必须要使用证书,因为SSL连接使用证书来进行验证。对于需要使用SSL来保证通信安全的客户端和服务器,都必须创建证书。证书的创建有2种方法,一种是通过证书由权威认证机构 (CA)来创建证书,目前知名的权威认证机构有 Verisign,Entrust 和 Thawte 等,虽然由CA来创建证书最权威,不过需要收费,所以另一种方法是使用JDK自带的工具来创建证书。不过因为主流浏览器默认都只认CA创建的证书是安全的,为此如果用JDK自带工具创建的证书时浏览器会提示用户服务器证书不是CA认证的,并询问用户是否接受(参见图F6-1-1)。
图F6-1-1
所以在内部的私有系统中产生你自己的证书是个很好的主意。但在公共系统中,最好从知名的 CA 处获得证书,以避免浏览器的安全警告。如果你接受证书,你就可以看到安全连接之后的页面。以后访问同一个网站的时候浏览器就不再会弹出安全警告了。有许多网站使用 HTTPS,而证书是自己产生或者由不知名的 CA 产生的。例如我们的网站https://www.kangaroo-egg.com。如果你没访问过我们的网页,你会看到像图F6-1-1一样的安全警告。
JDK提供了一个创建证书的工具,使用这个工具可以很容易生成自己的证书。这个工具在JDK 安装目录下的bin目录下,名字为keytool。下面我们就来介绍次工具如何使用,我们假设在windows环境下的c:\,那么用下列命令来为 HTTP 服务器创建一个证书:
c:\jdk1.5\bin\keytool -genkey -keystore key.store -alias kangaroo-egg
这个命令会产生一个由别名 kangaroo-egg 引用的证书,并将其保存在一个名为 key.store 的文件中。产生证书的时候,工具会提示我们输入一些信息,如下面的信息,其中黑体内容是用户输入的。
Enter keystore password: 123456
What is your first and last name?
[Unknown]: Shemin Dunne
What is the name of your organizational unit?
[Unknown]: Software Department
What is the name of your organization?
[Unknown]: Kangaroo-egg Software
What is the name of your City or Locality?
[Unknown]: ShangHai
What is the name of your State or Province?
[Unknown]: ShangHai
What is the two-letter country code for this unit?
[Unknown]: CN
Is CN=Shemin Dunne, OU=Software Department, O= Kangaroo-egg Software, L=ShangHai, ST=ShangHai, C=CN correct?
[no]: y
Enter key password for
(RETURN if same as keystore password): 654321
完成后就会在当前目录下生成key.store这个文件,所以这个文件绝对路径为:c:\jdk1.5\bin\key.store。于是我们配置webconfig.xml的https项(参见2.2节),配置后内容如下:
图F6-2-1
这样启动服务器后就可以用https访问了,如果将上面needClientAuth设置为true,则需要客户端提供合法的证书,否则会拒绝连接。您可以参见其它相关书籍以进一步了解相关内容。