首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Linux频道
中国IT教育
Google
首页 资讯动态 认证考试 新手入门 核心技术 高级技术 J2EE J2ME Java&XML 开源技术 其他技术 RSS订阅 论坛 专题
您现在的位置: 中国IT实验室 >> Java >> 核心技术 >> 网络编程 >> 正文

用J2SE1.4进行Internet安全编程

 

JSSE

Java 安全套接扩展 (JSSE) 提供一个框架及一个 100% 纯 Java 实现的 SSL 和 TLS 协议。它提供了数据加密、服务器验证、消息完成性和可选的客户端验证等机制。JSSE 的引人之外就是将复杂的、根本的加密算法抽象化了,这样就降低了受到敏感或者危险的安全性攻击的风险。另外,由于它能将 SSL 无缝地结合在应用当然,使安全应用的开发变得非常简单。JSSE 框架可以支撑许多不同的安全通信协议,如 SSL 2.0 和 3.0 以及 TLS 1.0,但是 J2SE v1.4.1 只实现了 SSL 3.0 和 TLS 1.0。

JSSE 编程

JSSE API 提供了扩充的网络套接字类、信用和密匙管理,以及为简化套接字创建而设计的套接字工厂框架,以此扩充 java.security 和 java.net 两个包。这些类都包含在 javax.net 和 javax.net.ssl 包中。

SSLSocket 和 SSLServerSocket

javax.net.ssl.SSLSocket 是 java.net.Socket 的子类,因此他支持所有标准 Socket 的方法,和一些为安全套接字新增加的方法。javax.net.ssl.SSLServerSocket 类与 SSLSocket 类相似,只是它用于创建服务器套接子,而 SSLSocket 不是。

创建一个 SSLSocket 实例有如何两种方法:

1. 用 SSLSocketFactory 实例执行 createSocket 方法来创建。

2. 通过 SSLServerSocket 的 accept 方法获得。

SSLSocketFactory 和 SSLServerSocketFactory

javax.net.ssl.SSLSocketFactory 类是用于创建安全套接字的对象工厂。javax.net.ssl.SSLServerSocketFactory 也是这样的工厂,但它用于创建安全的服务器套接字。

可以通过如下方法获得 SSLSocketFactory 实例:

1. 执行 SSLSocketFactory.getDefault 方法获得一个默认的工厂。

2. 通过特定的配置行为构造一个新的工厂。

注意默认的工厂的配置只允许服务器验证。

使现有的 Client/Server 应用变得安全

在现有的 C/S 应用中整合 SSL 以使其变得安全比较简单,使用几行 JSSE 代码就可以做到。为了使服务器变得安全,下面的例子中加黑显示的内容是必须的:

import java.io.*;

import javax.net.ssl.*;

public class Server {

int port = portNumber;

SSLServerSocket server;

try {

SSLServerSocketFactory factory =

(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();

server = (SSLServerSocket)

factory.createServerSocket(portNumber);

SSLSocket client = (SSLSocket)

server.accept();

// Create input and output streams as usual

// send secure messages to client through the

// output stream

// receive secure messages from client through

// the input stream

} catch(Exception e) {

}

}

为了使客户端变得安全,下面的例子中加黑显示的内容是必须的:

import java.io.*;

import javax.net.ssl.*;

public class Client {

...

try {

SSLSocketFactory factory = (SSLSocketFactory)

SSLSocketFactory.getDefault();

server = (SSLServerSocket)

factory.createServerSocket(portNumber);

SSLSocket client = (SSLSOcket)

factory.createSocket(serverHost, port);

// Create input and output streams as usual

// send secure messages to server through the

// output stream receive secure

// messages from server through the input stream

} catch(Exception e) {

}

}

SunJSSE 提供者

J2SE v1.4.1 和一个 JSSE 提供者,SunJSSE 一起发布。SunJSSE 安装并预登记了 Java 的加密体系。请把 SunJSSE 作为一个实现的名字来考虑,它提供了 SSL v3.0 和 TLS v1.0 的实现,也提供了普通的 SSL 和 TLS 密码组。如果你想找到你的实现 (这里是 SunJSSE) 所支持的密码组列表,可以调用 SSLSocket 的 getSupportedCipherSuites 方法。然而,不是所有这些密码组都是可用的。为了找出那些是可用的,调用 getEnabledCipherSuites 方法。这个列表可以用 setEnabledCipherSuites 方法来更改。

一个完整的例子

我发现使用 JSSE 开发最复杂的事情关系到系统设置以及管理证书和密匙。在这个例子中,我演示了如何开发、配置和运行一个完整的支持 GET 请求方法的 HTTP 服务器应用。

HTTP 概览

超文本传输协议 (Hypertext Transfer Protocol, HTTP) 是一个“请求-回应”的应用协议。这个协议支持一套固定的方法如 GET、POST、PUT、DELETE 等。一般用 GET 方法向服务器请求资源。这里有两个 GET 请求的例子:

GET / HTTP/1.0

GET /names.html HTTP/1.0

不安全的 HTTP 服务器

为了开发一个 HTTP 服务器,你得先搞明白 HTTP 协议是如何工作的。这个服务器是一个只支持 GET 请求方法的简单服务器。代码示例 1 是这个例子的实现。这是一个多线程的 HTTP 服务器,ProcessConnection 类用于执行不同线程中新的请求。当服务器收到一个来自浏览器的请求时,它解析这个请求并找出需要的文档。如果被请求的文档在服务器上可用,那么被请求的文档会由 shipDocument 方法送到服务器。如果被请求的文档没有打开,那么送到服务器的就是出错消息。

代码示例 1:HttpServer.java

import java.io.*;

import java.net.*;

import java.util.StringTokenizer;

/**

* This class implements a multithreaded simple HTTP

* server that supports the GET request method.

* It listens on port 44, waits client requests, and

* serves documents.

*/

public class HttpServer {

// The port number which the server

// will be listening on

public static final int HTTP_PORT = 8080;

public ServerSocket getServer() throws Exception {

return new ServerSocket(HTTP_PORT);

}

// multi-threading -- create a new connection

// for each request

public void run() {

ServerSocket listen;

try {

listen = getServer();

while(true) {

Socket client = listen.accept();

ProcessConnection cc = new

ProcessConnection(client);

}

} catch(Exception e) {

System.out.println("Exception:

"+e.getMessage());

}

}

// main program

public static void main(String argv[]) throws

Exception {

HttpServer httpserver = new HttpServer();

httpserver.run();

}

}

class ProcessConnection extends Thread {

Socket client;

BufferedReader is;

DataOutputStream os;

public ProcessConnection(Socket s) { // constructor client = s;

try {

is = new BufferedReader(new InputStreamReader

(client.getInputStream()));

os = new DataOutputStream(client.getOutputStream());

} catch (IOException e) {

System.out.println("Exception: "+e.getMessage());

}this.start(); // Thread starts here...this start()

will call run()

}

public void run() {

try {

// get a request and parse it.

String request = is.readLine();

System.out.println( "Request: "+request );

StringTokenizer st = new StringTokenizer( request );

if ( (st.countTokens() >= 2) &&

st.nextToken().equals("GET") ) {

if ( (request =

st.nextToken()).startsWith("/") )

request = request.substring( 1 );

if ( request.equals("") )

request = request + "index.html";

File f = new File(request);

shipDocument(os, f);

} else {

os.writeBytes( "400 Bad Request" );

}

client.close();

} catch (Exception e) {

System.out.println("Exception: " +

e.getMessage());

}

}

/**

* Read the requested file and ships it

* to the browser if found.

*/

public static void shipDocument(DataOutputStream out,

File f) throws Exception {

try {

DataInputStream in = new

DataInputStream(new FileInputStream(f));

int len = (int) f.length();

byte[] buf = new byte[len];

in.readFully(buf);

in.close();

out.writeBytes("HTTP/1.0 200 OK\r\n");

out.writeBytes("Content-Length: " + f.length() +"\r\n");

out.writeBytes("Content-Type: text/html\r\n\r\n");

out.write(buf);

out.flush();

}

catch (Exception e) {out.writeBytes("\r\n\r\n");

out.writeBytes("HTTP/1.0 400 " + e.getMessage() + "\r\n");

out.writeBytes("Content-Type: text/html\r\n\r\n");

out.writeBytes("");

out.flush();

} finally {

out.close();

}

}

}


 

上一页  [1] [2] [3] [4] [5] 下一页

【责编:Peng】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 ·Java入门 Tomcat的配置技巧精华专题…
 ·Oracle RMAN物理备份技术详解…
 今日更新
 社区讨论
 博客论点
 频道精选
 Java 频道导航