摘 要:探索带SSL的Web服务器的实现方案,力图提高客户与服务器通信的安全性,使之在应用中能更加方便快捷。
关键词:SSL;创建密钥库;设计SSL服务程序
引言
SSL能确保客户机连接到可信的服务器,并确保连接之后客户机与服务器之间的通信是安全的。SSL服务器上需要有专门的SSL服务程序和包含安全证书的密钥库。客户机通过浏览器向服务器发送SSL连接请求后,接收服务器返回的安全证书,用户可以根据安全证书的有效性决定是否连接,当用户选择连接之后,客户机和服务器之间的通信将受到加密保护。
1.程序说明
SSL(Security Socket Link Layer Protocol)即安全套接层协议,用于在服务器上建立指定端口的HTTPS协议服务,SSL能确保客户机连接到可信的服务器,并确保连接之后客户机与服务器之间的通信是安全的。
客户机通过浏览器向服务器发送SSL连接请求后,接收服务器返回的安全证书,用户可以根据安全证书的有效性决定是否连接,当用户选择连接之后,客户机和服务器之间的通信将受到加密保护。
访问带SSL的Web服务器不需要专门的客户端程序,通过浏览器使用HTTPS协议即可访问;而服务器端则需要专门的服务程序以及包含安全证书的密钥库。
2实现方案
2.1. 创建密钥库文件
服务器上的SSL服务程序需要使用密钥库文件(sslKeyStore),密钥库文件中包含返回给客户端的安全证书和用于加密的算法等。创建密钥库文件时需要声明在密钥库中生成证书,并指定加密算法、证书名、密钥库名、密钥库的密码、证书的密码,以及其他一些用户信息。Java只支持不对称密钥加密算法,所以只能在DSA和RSA中选择一个;证书名必须与服务器名一致(本例服务器名为bmwang);证书的密码可以与密钥库的密码相同。本例密钥库的设计如表1所示。
表1 密钥库设计
加密算法RSA证书名bmwang密钥库名sslKeyStore密钥库的密码1234567证书的密码1234567
创建密钥库文件是在DOS控制台上进行的,为方便起见,制作一个批处理文件,批处理命令如下:
c:JBuilder9jdk1.4binkeytool -genkey -v -keyalg RSA -alias bmwang -keystore sslKeyStore
其中:
keytool —— 调用Java JDK提供的密钥库管理工具,本例采用JBuilder自带的JDK,默认安装时路径为c:JBuilder9jdk1.4,keytool工具在bin子目录下,若安装时指定了其他的路径或采用独立发行的JDK,则修改为相应的路径。
-genkey —— keytool工具的运行参数,要求生成密钥库。
-v —— keytool工具的运行参数,要求生成证书。
-keyalg RSA —— keytool工具的运行参数,指定加密算法。
-alias bmwang —— keytool工具的运行参数,指定证书名。
-keystore sslKeyStore —— keytool工具的运行参数,指定密钥库名。
新建文件夹“Java”,打开记事本,输入上面的批处理命令,保存时,选择文件位置为“Java”文件夹,文件类型为“所有文件(*.*)”,文件名为“gk.bat”,文件主名可以随意,但扩展名必须是.bat。查看“Java”文件夹,其中应有“gk.bat”批处理文件。
双击运行“gk.bat”,输入密钥库密码(1234567)以及其他一些用户信息,当系统提示“输入
图1 生成密钥库
完成后,查看“Java”文件夹,看到系统生成了密钥库文件(sslKeyStore)。至此,创建密钥库文件已完成。
2.2 网页准备
设计一个简单的问候网页(exHTTPS.htm),当用户信任服务器的安全证书并连接和访问服务器时,服务器向客户机发送该网页。网页代码如下:
HTTPS Server Example
Hello, welcome here!
打开JCreator(也可使用其他的HTML代码编辑器或可视化设计器),单击工具栏的【New】按钮,在出现的对话框上,选择Files选项卡,在该选项卡上选择HTML File选项,输入网页文件名exHTTPS,并选择工作位置为“Java”文件夹,单击【确定】后进入编辑器。
输入上述代码,检查无误后单击工具栏的【Save】按钮保存,在Java文件夹中将出现exHTTPS.htm文件,网页制作完成。
2.3 设计SSL服务程序
由于服务程序只在后台运行,不需要提供方便用户操作的图形界面,所以设计成使用DOS控制台的Application程序,并且为简化起见,程序中直接使用网页文件的文件名(exHTTPS.htm)。程序整体框架如下:
import java.io.*;
import java.net.*;
import javax.net.ssl.*;
import java.security.*;
public class HTTPSServerExample
{
public static void main(String args[]) throws IOException
{
//创建SSL服务
while(true)
{
try
{
//提供SSL服务
}
catch(Exception e)
{
System.out.println(""程序出现运行错误。"");//显示出错信息
}
}
}
}
程序由引入声明和主类构成。在Java的SSL服务编程中,要用到java.net包、javax.net.ssl包和java.security包中的系统预定义类,在引入声明部分显式引入。创建SSL服务的代码、提供SSL服务可能出现运行时错误(异常,如端口不可用、找不到文件等),需要使用进行异常处理,对创建SSL服务的代码采用在代码所在的方法(main)头上声明抛出异常的方法处理,对提供SSL服务的代码采用try—catch语句处理。由于需要满足大量客户机的多次访问,提供SSL服务的代码要放在一个永久循环中,用条件为true的while语句实现
程序整体框架中的创建SSL服务代码的编程要点如下:
* 创建SSL套接服务生成器
* 建立SSL套接服务(HTTPS连接服务)
程序整体框架中的提供SSL服务代码的编程要点如下:
* 捕捉客户机的连接请求、建立连接通道、发送证书
* 创建输入流、接收确认信息
* 创建输出流、发送网页文件
* 关闭输出流、关闭输入流、关闭连接
打开JCreator(也可使用其他的Java代码编辑器或集成开发工具),单击工具栏的【New】按钮,在出现的对话框上,选择Files选项卡,在该选项卡上选择Java File选项,输入程序名HTTPSServerExample,并选择工作位置为“Java”文件夹,单
击【确定】后进入编辑器。
输入前面的程序整体框架,其中的创建SSL服务代码和提供SSL服务代码按照上述的编程要点设计,全部代码输入完成并检查无误后单击工具栏的【Save】按钮保存。选择【Builde】【Compile File】菜单命令进行编译,如有错误,可按照编译提示信息进行修改,然后保存并重新编译,直到提示“Process completed”,编译成功。
在DOS控制台进入“Java”目录后使用如下命令运行(输入时不主动换行):
c:JBuilder9jdk1.4binjava -Djavax.net.ssl.keyStore=sslKeyStore
-Djavax.net.ssl.keyStorePassword=1234567 HTTPSServerExample
命令行参数中:
-Djavax.net.ssl.keyStore=sslKeyStore —— 指定密钥库名。
-Djavax.net.ssl.keyStorePassword —— 指定密码。
为方便运行,可将该DOS命令做到一个批处理文件中(设为run.bat),保存在“Java”文件夹。
SSL服务程序运行后,在IE浏览器的地址栏输入HTTPS协议名和服务器的地址访问服务器了。
3.结语
将采用上述方案的程序嵌入网络上,客户与服务器的连接过程的安全性大大加强,而且客户端操作简单方便,当用户选择连接之后,客户机和服务器之间的通信将受到加密保护,安全性起到了很好的保驾效果。
除了应用于一般的实时通信外,本案更适用于现在流行商务交易信息。目前网络交易普遍存在信息安全隐患,尤其是在网络上有多种方法窃取和盗取信息内容,使用户感到信息不安全问题,本系统能很好的解决客户与服务器连接过程的安全保障,从而给信息安全带来了护驾功能。
参考文献:
.计算机研究与发展2004