Web Service详细解析及使用方法
XFire篇.... 2
XFire简介... 2
XFire特性... 2
XFire使用... 3
提供服务实现类... 3
服务类的接口类... 3
配置services.xml4
测试服务类... 4
客户端访问代码... 5
发布服务... 6
Axis篇.... 7
Axis简介... 7
SOAP. 8
Axis使用... 8
提供服务实现类... 8
配置web.xml9
配置server-config.wsdd. 10
客户端访问代码... 12
XFire和Axis的比较.... 14
XFire的优点... 14
XFire的缺点... 15
Axis的优点... 15
Axis的缺点... 16
CXF篇.... 16
CXF简介... 16
CXF使用... 17
提供服务实现类... 17
服务类的接口类... 17
测试服务类... 17
服务安全性.... 17
数字证书... 17
数字签名... 18
电子签章... 19
XFire篇
XFire简介
它拥有一个轻量级的信息处理模块,通过STAX来与SOAP信息相结合。提供了一个工作在web services下的简单API,支持POJO和schema开发。XFire是 CodeHaus 推出的下一代的 Java SOAP框架,它构建了 POJO 和 SOA 之间的桥梁,主要特性就是支持将 POJO 通过非常简单的方式发布成 Web 服务,这种处理方式不仅充分发挥了 POJO 的作用,简化了 Java 应用转化为 Web 服务的步骤和过程,也直接降低了 SOA 的实现难度,为企业转向 SOA 架构提供了一种简单可行的方式。通过提供简单的API和支持标准协议,可以很方便的开发面向服务的程序。内建在STAX基于流的XML解析引擎的基础上,XFire拥有很高的性能。
XFire特性
1)、支持重要的web服务标准,如SOAP、WSDL、WS-I、WS-Addressing、WS-Security基本概要等
2)、高性能的SOAP栈设计
3)、可插拔的绑定,支持POJO、XMLBeans、JAXB1.1、JAXB2及castor
4)、 jsr181规范
5)、支持多种传输协议:HTTP、JMS、XMPP、In-JVM
6)、可嵌入式的API
7)、 JBI支持
8)、客户端和服务器端的存根创建工具
9)、 JAX-WS的早期支持
XFire使用
首先打开IDE,创建一个普通的Java工程,将XFire所需要的jar加入到工程的类库引用中。创建一个简单的Java文件,这个文件只有一个名为sayHello的成员方法。
提供服务实现类
//包名
package net.ruixin.webservicedemo;
/**
* 服务实现类的实现
* @author caoxiang
*/
public class HelloWorldServiceImpl implements IHelloWorldService {
/**
* 返回名称的方法
* @param name 名称
*/
public String sayHello(String name){
return "您好,"+name;
}
}
服务类的接口类
//包名
package net.ruixin.webservicedemo;
/**
* 服务接口类的创建
* @author caoxiang
*/
public interface IHelloWorldService {
/**
* 返回名称的方法
* @param name 名称
* @return 返回值
*/
public String sayHello(String name);
}
配置services.xml
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>HelloWorldService</name>
<serviceClass>
net.ruixin.webservicedemo.IHelloWorldService
</serviceClass>
<implementationClass>
net.ruixin.webservicedemo.HelloWorldServiceImpl
</implementationClass>
<scope>application</scope>
</service>
</beans>
标签说明:
WebService的服务名
<name>HelloWorldService</name>
WebService的服务接口类<serviceClass>net.ruixin.webservicedemo.IHelloWorldService
</serviceClass>
WebService的服务接口实现类<implementationClass>net.ruixin.webservicedemo.HelloWorldServiceImpl</implementationClass>
WebService的服务有效范围
<scope>application</scope>
测试服务类
//包名
package net.ruixin.webservicedemo;
import java.net.MalformedURLException;
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
/**
* 测试服务类的创建
* @author caoxiang
*/
public class HelloWorldClient {
/**
* 测试主程序
* @param args
* @throws Exception
*/
public static void main(String args[]) {
//通过接口类创建Service对象
Service srvcModel = new ObjectServiceFactory()
.create(IHelloWorldService.class);
//通过XFire的工厂类创建工厂对象
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
//访问的地址
String helloWorldURL="http://localhost:5200/xfire_sample/services/HelloWorldService";
//异常处理
try {
//创建服务对象
IHelloWorldService srvc = (IHelloWorldService) factory.create(srvcModel, helloWorldURL);
//调用服务中的方法,并显示其结果
System.out.print(srvc.sayHello("dennis"));
//异常处理
} catch (MalformedURLException e) {
//显示错误信息
e.printStackTrace();
}
}
}
客户端访问代码
XFire、Axis以及其他的一些商业产品都提供了wsdl文档创建客户端代码的工具。这里用XFire提供的wsgen工具来创建客户端的访问代码。
Wsgen是XFire提供的一个ant task,task的申明如下:
<target name="Wsgen">
<taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask" classpathref="build.classpath" />
<wsgen outputDirectory="build.classpath" wsdl="http://localhost:portno/xfire_sample/services/HelloWorldService?wsdl" package="client" />
</target>
outputDirectory属性定义了创建代码的存放路径,wsdl是web服务的wsdl文件,package代表创建的代码的package。还可以通过binding属性指定bind类型,jaxb或者是xmlbeans。
这样就会在outputDirectory属性指定的目录下创建多个Java文件,这些文件提供了访问web服务的方法。
发布服务
XFire框架中,我们有两种方式将 POJO 发布成 Web 服务:
方式1:直接使用 Web 服务接口和 Web 服务实现类(POJO)来发布
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>HelloWorldService</name>
<serviceClass>
net.rubyeye.webservicedemo.IHelloWorldService
</serviceClass>
<implementationClass>
net.rubyeye.webservicedemo.HelloWorldServiceImpl
</implementationClass>
<style>wrapped</style>
<use>literal</use>
<scope>application</scope>
</service>
</beans>
方式2:基于 JSR181 标准和注释技术将被注释的 POJO 发布成 Web 服务;
package com.test;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
@WebService(name="Hello",serviceName="Hello",
targetNamespace="http://www.oksonic.cn/xfire")
public class Hello {
@WebMethod
@WebResult
public String getName(@WebParam String name){
return "Hello world " + name;
}
}
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<serviceClass>com.test.Hello</serviceClass>
<serviceFactory>jsr181</serviceFactory>
</service>
</beans>
XFire总结
XFire做为Java SOAP的开发框架,具备一定的优越性,比如他能够快速的开发,能够比较容易的部署到服务器上,做为soap4j的下一代开源框架,XFire不但拥有了上一代的优势,而且在其优势的基础上也进行了一定的扩展,增加了许多的扩展,对于webservice的开发,XFire做到了可以快速开发,快速部署,在服务器方面,XFire的性能比较优越,相比其他的web service框架,XFire的性能也是比较优越的。XFire在发布之后,如果客户端需要使用已经发布的web service,那么他就必须通过服务端程序生成客户端代码或者将服务端的接口类写入到客户端,在这方面Axis做得比XFire要好,因为Axis是面向wsdl的,针对的是服务的描叙,而并非是服务的本质(类和接口),对于使用者来说XFire开发简单,部署方便,性能优越这些都是XFire作为web service的优势所在,正如敏捷式一书的作者,这么说过,作为开发效率和速度是最重要的。
Axis篇
Axis简介
Axis是Apache组织推出的SOAP引擎,Axis项目是Apache组织著名的SOAP项目的后继项目,目前最新版本是采用Java开发的1.1版本,C++的版本正在开发之中。Axis v1.1软件包可以从http://ws.apache.org/axis/dist/1_1/下载得到。
但是Axis不仅仅是一个SOAP引擎,它还包括:
1)、一个独立运行的SOAP服务器
2)、一个servlet引擎的插件,这个servlet引擎可以是Tomcat
3)、对WSDL的扩展支持
4)、一个将WSDL的描述生成JAVA类的工具
5)、一些示例代码
6)、还有一个监控TCP/IP包的工具
SOAP简介
SOAP是一个基于XML的用于应用程序之间通信数据编码的传输协议。最初由微软和Userland Software提出,随着不断地完善和改进,SOAP很快被业界广泛应用,目前完全发布版本是1.1。在其发展过程中,W3C XML标准工作小组积极促成SOAP成为一个真正的开放标准。在写作此文档之时,SOAP1.2草案已经发布,1.2对1.1中相对混乱的部分做了改进。SOAP被广泛作为新一代跨平台、跨语言分布计算Web Services的重要部分。
Axis使用
提供服务实现类
//包名
package zpf;
/**
* 服务实现类的实现
* @author caoxiang
*/
public class SSOWebservice
{
/**
登陆并得到用户信息
*/
public boolean login(String loginid, String password) {
//判断用户是否登陆成功的标记
boolean ret = false;
if (loginid.equals("caoxiang") && password.equals("caoxiang "))
ret = true;
else
ret = false;
//返回
return ret;
}
}
配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>
org.codehaus.xfire.transport.http.XFireConfigurableServlet
</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>
org.apache.axis.transport.http.AxisServlet
</servlet-class>
</servlet>
<servlet>
<servlet-name>AdminServlet</servlet-name>
<servlet-class>
org.apache.axis.transport.http.AdminServlet
</servlet-class>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet>
<servlet-name>SOAPMonitorService</servlet-name>
<servlet-class>
org.apache.axis.monitor.SOAPMonitorService
</servlet-class>
<init-param>
<param-name>SOAPMonitorPort</param-name>
<param-value>5001</param-value>
</init-param>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SOAPMonitorService</servlet-name>
<url-pattern>/SOAPMonitor</url-pattern>
</servlet-mapping>
<mime-mapping>
<extension>wsdl</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xsd</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
</web-app>
配置server-config.wsdd
<?xml version="1.0" encoding="gb2312"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
<parameter name="adminPassword" value="admin" />
<parameter name="enableNamespacePrefixOptimization"
value="true" />
<parameter name="attachments.Directory" value="D:/jakarta-tomcat-5.0.28/webapps/axis/WEB-INF/attachments" />
<parameter name="disablePrettyXML" value="true" />
<parameter name="attachments.implementation"
value="org.apache.axis.attachments.AttachmentsImpl" />
<parameter name="sendXsiTypes" value="true" />
<parameter name="sendMultiRefs" value="true" />
<parameter name="sendXMLDeclaration" value="true" />
<requestFlow>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="session" />
</handler>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="request" />
<parameter name="extension" value=".jwr" />
</handler>
</requestFlow>
</globalConfiguration>
<handler name="LocalResponder"
type="java:org.apache.axis.transport.local.LocalResponder" />
<handler name="URLMapper"
type="java:org.apache.axis.handlers.http.URLMapper" />
<handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />
<!-- 自定义服务开始 -->
<!-- 单点登陆服务 add by Zhang.P.F -->
<service name="SSOWebservice" provider="java:RPC">
<parameter name="allowedMethods" value="*" />
<parameter name="className" value="zpf.SSOWebservice" />
<operation name="login" returnType="ns:boolean">
<parameter name="loginid" type="ns:String" />
<parameter name="password" type="ns:String" />
</operation>
</service>
<!-- 自定义服务结束 -->
<service name="AdminService" provider="java:MSG">
<parameter name="allowedMethods" value="AdminService" />
<parameter name="enableRemoteAdmin" value="false" />
<parameter name="className" value="org.apache.axis.utils.Admin" />
<namespace>http://xml.apache.org/axis/wsdd/</namespace>
<namespace>http://xml.apache.org/axis/wsdd/</namespace>
</service>
<service name="Version" provider="java:RPC">
<parameter name="allowedMethods" value="getVersion" />
<parameter name="className" value="org.apache.axis.Version" />
</service>
<transport name="http">
<requestFlow>
<handler type="URLMapper" />
<handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />
</requestFlow>
<parameter name="qs:list"
value="org.apache.axis.transport.http.QSListHandler" />
<parameter name="qs:wsdl"
value="org.apache.axis.transport.http.QSWSDLHandler" />
<parameter name="qs.list"
value="org.apache.axis.transport.http.QSListHandler" />
<parameter name="qs.method"
value="org.apache.axis.transport.http.QSMethodHandler" />
<parameter name="qs:method"
value="org.apache.axis.transport.http.QSMethodHandler" />
<parameter name="qs.wsdl"
value="org.apache.axis.transport.http.QSWSDLHandler" />
</transport>
<transport name="local">
<responseFlow>
<handler type="LocalResponder" />
</responseFlow>
</transport>
</deployment>
客户端访问代码
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import javax.xml.rpc.ParameterMode;
/**
* 客户端登陆类的实现
* @author caoxiang
*/
public class CallC
{
/**
* 测试主程序
* @param args
* @throws Exception
*/
public static void main(String [] args) throws Exception {
try{
//服务路径
String endpoint = "http://localhost:5200/axis_sample/services/SSOWebservice";
//用户名
String user= new String("1");
//密码
String password=new String("2");
//服务对象
Service service = new Service();
//调用服务的对象
Call call = (Call) service.createCall();
//设置目标服务
call.setTargetEndpointAddress(new java.net.URL(endpoint));
//设置调用的方法
call.setOperationName("login");
//设置参数
call.addParameter("loginid", XMLType.XSD_STRING, ParameterMode.IN);
//设置参数
call.addParameter("password", XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType(XMLType.XSD_BOOLEAN);
//用于判断用户是否登陆的成功的标记
Boolean bv = false;
//判断服务对象是否为空
if(call!=null) {
//调用服务端程序,并接收服务端的返回值
bv = (Boolean)call.invoke(new Object[] {user, password});
}
//如果登陆成功
if(bv) {
System.out.println("用户登陆成功了" );
} else {
System.out.println("用户登陆失败了" );
}
}
//异常处理
catch(Exception e){
//显示错误
e.printStackTrace();
}
}
}
Axis总结
Axis做为soap4j的下一代开源框架,它提供了支持java SOAP服务器的API,但是Axis在配置文件和部署服务上都是比较繁琐的,在服务器性能方面Axis的性能没有用XFire部署的服务性能要高,但是Axis在发布客户端代码时比XFire要方便,因为Axis可以不需要服务端生成的接口和类便可以调用服务端程序,但是XFire需要服务端的程序或者服务端生成的客户端程序。虽然Axis没有比较全面的文档,但是Axis的接口还是比较简单的,可以进行简单的一次开发,对于部署,Axis配置文件虽然繁琐,但是都是XML文件的形式表达的,所以对于修改Axis文件还是比较简单的,之所以Axis的用户比XFire的用户要多,可能是Axis都是面向XML进行部署的,而其他的web service开源软件都是面向类和接口去部署,这点是Axis的部署和其他不同点,对于服务的兼容性Axis的支持性远远比其他的开源框架要多,在性能方面虽然Axis不足于XFire,但是Axis的性能还是比较可靠的。在兼容性方面Axis可以很好的和其他的web开发语言融合,而XFire只能支持有jdk1.5的环境,对于这点Axis无需jdk1.5的要求,所以说在这点,Axis领先于XFire。对于任何一个开发者不管你是开发web service还是开发web project,Axis都比较适用。
XFire和Axis的比较
XFire的优点
XFire方便(简化Web服务开发),开发速度快,易于上手,配置简洁,可以和Spring很好的结合。
図 3
● 本地数据绑定功能。支持普通Java对象(POJO)、XMLBeans、面向XML绑定的Java架构(JAXB)和Castor等。数据绑定指定了发送至Web服务的XML请求以及返回的XML响应如何映射成Java对象。
● 使用用于XML的流式API(StAX)处理XML文档。与文档对象模型(DOM)的基于树形的方法以及用于XML的简单API(SAX)的事件驱动方法相比,StAX使用了基于拉取的机制,这不但大大加快了速度,还提高了内存的使用效率。
● 支持各种传输协议,譬如HTTP、Java消息服务(JMS)和Java虚拟机内部传输(in-JVM transport)。
● 嵌入功能,这是XFire的主要优点之一。可以把这个SOAP引擎嵌入到应用当中,完全隐藏XFire特定的所有引用,因为所有配置都是程序驱动的。
● 具有丰富的API,这样一来,非常容易定制,让开发人员可以在需要时,在不同阶段截获请求,并且进行处理。
● 符合诸多最新标准,譬如SOAP 1.1(没有编码的远程过程调用即RPC)和1.2、WSDL 1.1、Web服务互操作性组织的Basic Profile 1.0、Web服务寻址规范和Web服务安全标准。
● 性能和局限,Web服务使用许多资源,但它们的性能并不高。XFire打破了这个传统。与同类的SOAP引擎相比,XFire使用的内存大大减少(一方面是由于使用StAX),而性能却大大提高。另外,XFire还提供了进一步优化性能的几种方法。方法之一就是使用Java虚拟机内部传输。如果知道Web服务与客户程序在同一个Java虚拟机里面运行,就可以选择使用本地传输,这样可以高速传输服务。
● XFire支持web service standards,Spring整合,支持JBI,AXB 和XMLBeans.
XFire的缺点
● 缺少支持附件的功能,不过将来的版本一定能支持该功能。
● 缺少简单易懂的用户指南,XFire开发队伍在这方面有许多工作要做。
Axis的优点
● Axis应用了管道和过滤器模式.Aixs是apache开源的webservice实现服务器。简单的说,axis就是处理Message,它首先截获客户端的请求,然后转发到真正的实现业务逻辑上处理客户端的请求,在这之前经过一系列的handler处理.它的结构很像EJB容器.其实就是管道和过滤器模式的应用,Handler就是过滤器.它的处理顺序主要考虑两个方面一个是部署描述符(deployment configuration )另一个就是是客户端还是服务器端。Handler处理的对象是MessageContext它的由3个重要的部分组成,一是一个request Message,一个是response message,还有许多属性。经研究源码分析,在服务器端,有一个Transport Listener 它监听客户端的请求,可以通过多种协议,一旦有客户请求,它将按照协议的规范把数据解析生成生成一个Message对象,然后把它设置到MessageContext,然后调用一系列的Handler进行处理。
其结构图如下:
● 支持附件的功能
Axis的缺点
● 开发过程比较繁琐,配置比较复杂,部署服务器比较麻烦。
● 缺少简单易懂的用户指南,Axis开发队伍在这方面有许多工作要做。
● 性能不够优越。
CXF篇
CXF简介
作为继承Celtix以及XFire两大开源项目的精华,CXF提供 JAX-WS的全面支持,并且提供了多种Binding以及Transport的支持,可以采用WSDL first 或者 Code first 轻松实现WebService的发布和使用。
CXF是一个JAX-WS API的实现。
CXF支持多种binding,transport。
CXF支持也支持除JAX-WS之外的服务模型,例如JBI,CORBA,SCA等。
CXF采用CodeFirst的服务发布方式。
CXF使用
提供服务实现类
public interface HelloImpl {
public String sayHello() {
return "hello";
}
}
服务类的接口类
public interface Hello {
String sayHello();
}
测试服务类
import org.apache.cxf.frontend.ServerFactoryBean;
// Create our service implementation
HelloWorldImpl helloWorldImpl = new HelloWorldImpl();
// Create our Server
ServerFactoryBean svrFactory = new ServerFactoryBean();
svrFactory.setServiceClass(Hello.class);
svrFactory.setAddress("http://localhost:8080/Hello") ;
svrFactory.setServiceBean(helloWorldImpl);
svrFactory.create();
服务安全性
数字证书
Ø 相当于身份证件,数字证书是在IE中做为一种身份标识的。
Ø 由于Internet网电子商务系统技术使在网上购物的顾客能够极其方便轻松地获得商家和企业的信息,但同时也增加了对某些敏感或有价值的数据被滥用的风险. 为了保证互联网上电子交易及支付的安全性,保密性等,防范交易及支付过程中的欺诈行为,必须在网上建立一种信任机制。这就要求参加电子商务的买方和卖方都必须拥有合法的身份,并且在网上能够有效无误的被进行验证。数字证书是一种权威性的电子文档。它提供了一种在Internet上验证您身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构----CA证书授权(Certificate Authority)中心发行的,人们可以在互联网交往中用它来识别对方的身份。当然在数字证书认证的过程中,证书认证中心(CA)作为权威的、公正的、可信赖的第三方,其作用是至关重要的。
Ø 数字证书也必须具有唯一性和可靠性。为了达到这一目的,需要采用很多技术来实现。通常,数字证书采用公钥体制,即利用一对互相匹配的密钥进行加密、解密。每个用户自己设定一把特定的仅为本人所有的私有密钥(私钥),用它进行解密和签名;同时设定一把公共密钥(公钥)并由本人公开,为一组用户所共享,用于加密和验证签名。当发送一份保密文件时,发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,这样信息就可以安全无误地到达目的地了。通过数字的手段保证加密过程是一个不可逆过程,即只有用私有密钥才能解密。公开密钥技术解决了密钥发布的管理问题,用户可以公开其公开密钥,而保留其私有密钥。
Ø 数字证书颁发过程一般为:用户首先产生自己的密钥对,并将公共密钥及部分个人身份信息传送给认证中心。认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内包含用户的个人信息和他的公钥信息,同时还附有认证中心的签名信息。用户就可以使用自己的数字证书进行相关的各种活动。数字证书由独立的证书发行机构发布。数字证书各不相同,每种证书可提供不同级别的可信度。可以从证书发行机构获得您自己的数字证书。
Ø 目前的数字证书类型主要包括:个人数字证书、单位数字证书、单位员工数字证书、服务器证书、VPN证书、WAP证书、代码签名证书和表单签名证书。
Ø 随着Internet的普及、各种电子商务活动和电子政务活动的飞速发展,数字证书开始广泛地应用到各个领域之中,目前主要包括:发送安全电子邮件、访问安全站点、网上招标投标、网上签约、网上订购、安全网上公文传送、网上缴费、网上缴税、网上炒股、网上购物和网上报关等。
数字签名
相当于在现实社会中给文件签名那种。
简单地说,所谓数字签名就是附加在数据单元上的一些数据,或是对数据单元所作的密码变换。这种数据或变换允许数据单元的接收者用以确认数据单元的来源和数据单元的完整性并保护数据,防止被人(例如接收者)进行伪造。它是对电子形式的消息进行签名的一种方法,一个签名消息能在一个通信网络中传输。基于公钥密码体制和私钥密码体制都可以获得数字签名,目前主要是基于公钥密码体制的数字签名。包括普通数字签名和特殊数字签名。普通数字签名算法有RSA、ElGamal、Fiat-Shamir、Guillou- Quisquarter、Schnorr、Ong-Schnorr-Shamir数字签名算法、Des/DSA,椭圆曲线数字签名算法和有限自动机数字签名算法等。特殊数字签名有盲签名、代理签名、群签名、不可否认签名、公平盲签名、门限签名、具有消息恢复功能的签名等,它与具体应用环境密切相关。显然,数字签名的应用涉及到法律问题,美国联邦政府基于有限域上的离散对数问题制定了自己的数字签名标准(DSS)。一些国家如法国和德国已经制定了数字签名法。
XFire篇.... 2
XFire简介... 2
XFire特性... 2
XFire使用... 3
提供服务实现类... 3
服务类的接口类... 3
配置services.xml4
测试服务类... 4
客户端访问代码... 5
发布服务... 6
Axis篇.... 7
Axis简介... 7
SOAP. 8
Axis使用... 8
提供服务实现类... 8
配置web.xml9
配置server-config.wsdd. 10
客户端访问代码... 12
XFire和Axis的比较.... 14
XFire的优点... 14
XFire的缺点... 15
Axis的优点... 15
Axis的缺点... 16
CXF篇.... 16
CXF简介... 16
CXF使用... 17
提供服务实现类... 17
服务类的接口类... 17
测试服务类... 17
服务安全性.... 17
数字证书... 17
数字签名... 18
电子签章... 19
XFire篇
XFire简介
它拥有一个轻量级的信息处理模块,通过STAX来与SOAP信息相结合。提供了一个工作在web services下的简单API,支持POJO和schema开发。XFire是 CodeHaus 推出的下一代的 Java SOAP框架,它构建了 POJO 和 SOA 之间的桥梁,主要特性就是支持将 POJO 通过非常简单的方式发布成 Web 服务,这种处理方式不仅充分发挥了 POJO 的作用,简化了 Java 应用转化为 Web 服务的步骤和过程,也直接降低了 SOA 的实现难度,为企业转向 SOA 架构提供了一种简单可行的方式。通过提供简单的API和支持标准协议,可以很方便的开发面向服务的程序。内建在STAX基于流的XML解析引擎的基础上,XFire拥有很高的性能。
XFire特性
1)、支持重要的web服务标准,如SOAP、WSDL、WS-I、WS-Addressing、WS-Security基本概要等
2)、高性能的SOAP栈设计
3)、可插拔的绑定,支持POJO、XMLBeans、JAXB1.1、JAXB2及castor
4)、 jsr181规范
5)、支持多种传输协议:HTTP、JMS、XMPP、In-JVM
6)、可嵌入式的API
7)、 JBI支持
8)、客户端和服务器端的存根创建工具
9)、 JAX-WS的早期支持
XFire使用
首先打开IDE,创建一个普通的Java工程,将XFire所需要的jar加入到工程的类库引用中。创建一个简单的Java文件,这个文件只有一个名为sayHello的成员方法。
提供服务实现类
//包名
package net.ruixin.webservicedemo;
/**
* 服务实现类的实现
* @author caoxiang
*/
public class HelloWorldServiceImpl implements IHelloWorldService {
/**
* 返回名称的方法
* @param name 名称
*/
public String sayHello(String name){
return "您好,"+name;
}
}
服务类的接口类
//包名
package net.ruixin.webservicedemo;
/**
* 服务接口类的创建
* @author caoxiang
*/
public interface IHelloWorldService {
/**
* 返回名称的方法
* @param name 名称
* @return 返回值
*/
public String sayHello(String name);
}
配置services.xml
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>HelloWorldService</name>
<serviceClass>
net.ruixin.webservicedemo.IHelloWorldService
</serviceClass>
<implementationClass>
net.ruixin.webservicedemo.HelloWorldServiceImpl
</implementationClass>
<scope>application</scope>
</service>
</beans>
标签说明:
WebService的服务名
<name>HelloWorldService</name>
WebService的服务接口类<serviceClass>net.ruixin.webservicedemo.IHelloWorldService
</serviceClass>
WebService的服务接口实现类<implementationClass>net.ruixin.webservicedemo.HelloWorldServiceImpl</implementationClass>
WebService的服务有效范围
<scope>application</scope>
测试服务类
//包名
package net.ruixin.webservicedemo;
import java.net.MalformedURLException;
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
/**
* 测试服务类的创建
* @author caoxiang
*/
public class HelloWorldClient {
/**
* 测试主程序
* @param args
* @throws Exception
*/
public static void main(String args[]) {
//通过接口类创建Service对象
Service srvcModel = new ObjectServiceFactory()
.create(IHelloWorldService.class);
//通过XFire的工厂类创建工厂对象
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
//访问的地址
String helloWorldURL="http://localhost:5200/xfire_sample/services/HelloWorldService";
//异常处理
try {
//创建服务对象
IHelloWorldService srvc = (IHelloWorldService) factory.create(srvcModel, helloWorldURL);
//调用服务中的方法,并显示其结果
System.out.print(srvc.sayHello("dennis"));
//异常处理
} catch (MalformedURLException e) {
//显示错误信息
e.printStackTrace();
}
}
}
客户端访问代码
XFire、Axis以及其他的一些商业产品都提供了wsdl文档创建客户端代码的工具。这里用XFire提供的wsgen工具来创建客户端的访问代码。
Wsgen是XFire提供的一个ant task,task的申明如下:
<target name="Wsgen">
<taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask" classpathref="build.classpath" />
<wsgen outputDirectory="build.classpath" wsdl="http://localhost:portno/xfire_sample/services/HelloWorldService?wsdl" package="client" />
</target>
outputDirectory属性定义了创建代码的存放路径,wsdl是web服务的wsdl文件,package代表创建的代码的package。还可以通过binding属性指定bind类型,jaxb或者是xmlbeans。
这样就会在outputDirectory属性指定的目录下创建多个Java文件,这些文件提供了访问web服务的方法。
发布服务
XFire框架中,我们有两种方式将 POJO 发布成 Web 服务:
方式1:直接使用 Web 服务接口和 Web 服务实现类(POJO)来发布
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>HelloWorldService</name>
<serviceClass>
net.rubyeye.webservicedemo.IHelloWorldService
</serviceClass>
<implementationClass>
net.rubyeye.webservicedemo.HelloWorldServiceImpl
</implementationClass>
<style>wrapped</style>
<use>literal</use>
<scope>application</scope>
</service>
</beans>
方式2:基于 JSR181 标准和注释技术将被注释的 POJO 发布成 Web 服务;
package com.test;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
@WebService(name="Hello",serviceName="Hello",
targetNamespace="http://www.oksonic.cn/xfire")
public class Hello {
@WebMethod
@WebResult
public String getName(@WebParam String name){
return "Hello world " + name;
}
}
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<serviceClass>com.test.Hello</serviceClass>
<serviceFactory>jsr181</serviceFactory>
</service>
</beans>
XFire总结
XFire做为Java SOAP的开发框架,具备一定的优越性,比如他能够快速的开发,能够比较容易的部署到服务器上,做为soap4j的下一代开源框架,XFire不但拥有了上一代的优势,而且在其优势的基础上也进行了一定的扩展,增加了许多的扩展,对于webservice的开发,XFire做到了可以快速开发,快速部署,在服务器方面,XFire的性能比较优越,相比其他的web service框架,XFire的性能也是比较优越的。XFire在发布之后,如果客户端需要使用已经发布的web service,那么他就必须通过服务端程序生成客户端代码或者将服务端的接口类写入到客户端,在这方面Axis做得比XFire要好,因为Axis是面向wsdl的,针对的是服务的描叙,而并非是服务的本质(类和接口),对于使用者来说XFire开发简单,部署方便,性能优越这些都是XFire作为web service的优势所在,正如敏捷式一书的作者,这么说过,作为开发效率和速度是最重要的。
Axis篇
Axis简介
Axis是Apache组织推出的SOAP引擎,Axis项目是Apache组织著名的SOAP项目的后继项目,目前最新版本是采用Java开发的1.1版本,C++的版本正在开发之中。Axis v1.1软件包可以从http://ws.apache.org/axis/dist/1_1/下载得到。
但是Axis不仅仅是一个SOAP引擎,它还包括:
1)、一个独立运行的SOAP服务器
2)、一个servlet引擎的插件,这个servlet引擎可以是Tomcat
3)、对WSDL的扩展支持
4)、一个将WSDL的描述生成JAVA类的工具
5)、一些示例代码
6)、还有一个监控TCP/IP包的工具
SOAP简介
SOAP是一个基于XML的用于应用程序之间通信数据编码的传输协议。最初由微软和Userland Software提出,随着不断地完善和改进,SOAP很快被业界广泛应用,目前完全发布版本是1.1。在其发展过程中,W3C XML标准工作小组积极促成SOAP成为一个真正的开放标准。在写作此文档之时,SOAP1.2草案已经发布,1.2对1.1中相对混乱的部分做了改进。SOAP被广泛作为新一代跨平台、跨语言分布计算Web Services的重要部分。
Axis使用
提供服务实现类
//包名
package zpf;
/**
* 服务实现类的实现
* @author caoxiang
*/
public class SSOWebservice
{
/**
登陆并得到用户信息
*/
public boolean login(String loginid, String password) {
//判断用户是否登陆成功的标记
boolean ret = false;
if (loginid.equals("caoxiang") && password.equals("caoxiang "))
ret = true;
else
ret = false;
//返回
return ret;
}
}
配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>
org.codehaus.xfire.transport.http.XFireConfigurableServlet
</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>
org.apache.axis.transport.http.AxisServlet
</servlet-class>
</servlet>
<servlet>
<servlet-name>AdminServlet</servlet-name>
<servlet-class>
org.apache.axis.transport.http.AdminServlet
</servlet-class>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet>
<servlet-name>SOAPMonitorService</servlet-name>
<servlet-class>
org.apache.axis.monitor.SOAPMonitorService
</servlet-class>
<init-param>
<param-name>SOAPMonitorPort</param-name>
<param-value>5001</param-value>
</init-param>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SOAPMonitorService</servlet-name>
<url-pattern>/SOAPMonitor</url-pattern>
</servlet-mapping>
<mime-mapping>
<extension>wsdl</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xsd</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
</web-app>
配置server-config.wsdd
<?xml version="1.0" encoding="gb2312"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
<parameter name="adminPassword" value="admin" />
<parameter name="enableNamespacePrefixOptimization"
value="true" />
<parameter name="attachments.Directory" value="D:/jakarta-tomcat-5.0.28/webapps/axis/WEB-INF/attachments" />
<parameter name="disablePrettyXML" value="true" />
<parameter name="attachments.implementation"
value="org.apache.axis.attachments.AttachmentsImpl" />
<parameter name="sendXsiTypes" value="true" />
<parameter name="sendMultiRefs" value="true" />
<parameter name="sendXMLDeclaration" value="true" />
<requestFlow>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="session" />
</handler>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="request" />
<parameter name="extension" value=".jwr" />
</handler>
</requestFlow>
</globalConfiguration>
<handler name="LocalResponder"
type="java:org.apache.axis.transport.local.LocalResponder" />
<handler name="URLMapper"
type="java:org.apache.axis.handlers.http.URLMapper" />
<handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />
<!-- 自定义服务开始 -->
<!-- 单点登陆服务 add by Zhang.P.F -->
<service name="SSOWebservice" provider="java:RPC">
<parameter name="allowedMethods" value="*" />
<parameter name="className" value="zpf.SSOWebservice" />
<operation name="login" returnType="ns:boolean">
<parameter name="loginid" type="ns:String" />
<parameter name="password" type="ns:String" />
</operation>
</service>
<!-- 自定义服务结束 -->
<service name="AdminService" provider="java:MSG">
<parameter name="allowedMethods" value="AdminService" />
<parameter name="enableRemoteAdmin" value="false" />
<parameter name="className" value="org.apache.axis.utils.Admin" />
<namespace>http://xml.apache.org/axis/wsdd/</namespace>
<namespace>http://xml.apache.org/axis/wsdd/</namespace>
</service>
<service name="Version" provider="java:RPC">
<parameter name="allowedMethods" value="getVersion" />
<parameter name="className" value="org.apache.axis.Version" />
</service>
<transport name="http">
<requestFlow>
<handler type="URLMapper" />
<handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />
</requestFlow>
<parameter name="qs:list"
value="org.apache.axis.transport.http.QSListHandler" />
<parameter name="qs:wsdl"
value="org.apache.axis.transport.http.QSWSDLHandler" />
<parameter name="qs.list"
value="org.apache.axis.transport.http.QSListHandler" />
<parameter name="qs.method"
value="org.apache.axis.transport.http.QSMethodHandler" />
<parameter name="qs:method"
value="org.apache.axis.transport.http.QSMethodHandler" />
<parameter name="qs.wsdl"
value="org.apache.axis.transport.http.QSWSDLHandler" />
</transport>
<transport name="local">
<responseFlow>
<handler type="LocalResponder" />
</responseFlow>
</transport>
</deployment>
客户端访问代码
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import javax.xml.rpc.ParameterMode;
/**
* 客户端登陆类的实现
* @author caoxiang
*/
public class CallC
{
/**
* 测试主程序
* @param args
* @throws Exception
*/
public static void main(String [] args) throws Exception {
try{
//服务路径
String endpoint = "http://localhost:5200/axis_sample/services/SSOWebservice";
//用户名
String user= new String("1");
//密码
String password=new String("2");
//服务对象
Service service = new Service();
//调用服务的对象
Call call = (Call) service.createCall();
//设置目标服务
call.setTargetEndpointAddress(new java.net.URL(endpoint));
//设置调用的方法
call.setOperationName("login");
//设置参数
call.addParameter("loginid", XMLType.XSD_STRING, ParameterMode.IN);
//设置参数
call.addParameter("password", XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType(XMLType.XSD_BOOLEAN);
//用于判断用户是否登陆的成功的标记
Boolean bv = false;
//判断服务对象是否为空
if(call!=null) {
//调用服务端程序,并接收服务端的返回值
bv = (Boolean)call.invoke(new Object[] {user, password});
}
//如果登陆成功
if(bv) {
System.out.println("用户登陆成功了" );
} else {
System.out.println("用户登陆失败了" );
}
}
//异常处理
catch(Exception e){
//显示错误
e.printStackTrace();
}
}
}
Axis总结
Axis做为soap4j的下一代开源框架,它提供了支持java SOAP服务器的API,但是Axis在配置文件和部署服务上都是比较繁琐的,在服务器性能方面Axis的性能没有用XFire部署的服务性能要高,但是Axis在发布客户端代码时比XFire要方便,因为Axis可以不需要服务端生成的接口和类便可以调用服务端程序,但是XFire需要服务端的程序或者服务端生成的客户端程序。虽然Axis没有比较全面的文档,但是Axis的接口还是比较简单的,可以进行简单的一次开发,对于部署,Axis配置文件虽然繁琐,但是都是XML文件的形式表达的,所以对于修改Axis文件还是比较简单的,之所以Axis的用户比XFire的用户要多,可能是Axis都是面向XML进行部署的,而其他的web service开源软件都是面向类和接口去部署,这点是Axis的部署和其他不同点,对于服务的兼容性Axis的支持性远远比其他的开源框架要多,在性能方面虽然Axis不足于XFire,但是Axis的性能还是比较可靠的。在兼容性方面Axis可以很好的和其他的web开发语言融合,而XFire只能支持有jdk1.5的环境,对于这点Axis无需jdk1.5的要求,所以说在这点,Axis领先于XFire。对于任何一个开发者不管你是开发web service还是开发web project,Axis都比较适用。
XFire和Axis的比较
XFire的优点
XFire方便(简化Web服务开发),开发速度快,易于上手,配置简洁,可以和Spring很好的结合。
図 3
● 本地数据绑定功能。支持普通Java对象(POJO)、XMLBeans、面向XML绑定的Java架构(JAXB)和Castor等。数据绑定指定了发送至Web服务的XML请求以及返回的XML响应如何映射成Java对象。
● 使用用于XML的流式API(StAX)处理XML文档。与文档对象模型(DOM)的基于树形的方法以及用于XML的简单API(SAX)的事件驱动方法相比,StAX使用了基于拉取的机制,这不但大大加快了速度,还提高了内存的使用效率。
● 支持各种传输协议,譬如HTTP、Java消息服务(JMS)和Java虚拟机内部传输(in-JVM transport)。
● 嵌入功能,这是XFire的主要优点之一。可以把这个SOAP引擎嵌入到应用当中,完全隐藏XFire特定的所有引用,因为所有配置都是程序驱动的。
● 具有丰富的API,这样一来,非常容易定制,让开发人员可以在需要时,在不同阶段截获请求,并且进行处理。
● 符合诸多最新标准,譬如SOAP 1.1(没有编码的远程过程调用即RPC)和1.2、WSDL 1.1、Web服务互操作性组织的Basic Profile 1.0、Web服务寻址规范和Web服务安全标准。
● 性能和局限,Web服务使用许多资源,但它们的性能并不高。XFire打破了这个传统。与同类的SOAP引擎相比,XFire使用的内存大大减少(一方面是由于使用StAX),而性能却大大提高。另外,XFire还提供了进一步优化性能的几种方法。方法之一就是使用Java虚拟机内部传输。如果知道Web服务与客户程序在同一个Java虚拟机里面运行,就可以选择使用本地传输,这样可以高速传输服务。
● XFire支持web service standards,Spring整合,支持JBI,AXB 和XMLBeans.
XFire的缺点
● 缺少支持附件的功能,不过将来的版本一定能支持该功能。
● 缺少简单易懂的用户指南,XFire开发队伍在这方面有许多工作要做。
Axis的优点
● Axis应用了管道和过滤器模式.Aixs是apache开源的webservice实现服务器。简单的说,axis就是处理Message,它首先截获客户端的请求,然后转发到真正的实现业务逻辑上处理客户端的请求,在这之前经过一系列的handler处理.它的结构很像EJB容器.其实就是管道和过滤器模式的应用,Handler就是过滤器.它的处理顺序主要考虑两个方面一个是部署描述符(deployment configuration )另一个就是是客户端还是服务器端。Handler处理的对象是MessageContext它的由3个重要的部分组成,一是一个request Message,一个是response message,还有许多属性。经研究源码分析,在服务器端,有一个Transport Listener 它监听客户端的请求,可以通过多种协议,一旦有客户请求,它将按照协议的规范把数据解析生成生成一个Message对象,然后把它设置到MessageContext,然后调用一系列的Handler进行处理。
其结构图如下:
● 支持附件的功能
Axis的缺点
● 开发过程比较繁琐,配置比较复杂,部署服务器比较麻烦。
● 缺少简单易懂的用户指南,Axis开发队伍在这方面有许多工作要做。
● 性能不够优越。
CXF篇
CXF简介
作为继承Celtix以及XFire两大开源项目的精华,CXF提供 JAX-WS的全面支持,并且提供了多种Binding以及Transport的支持,可以采用WSDL first 或者 Code first 轻松实现WebService的发布和使用。
CXF是一个JAX-WS API的实现。
CXF支持多种binding,transport。
CXF支持也支持除JAX-WS之外的服务模型,例如JBI,CORBA,SCA等。
CXF采用CodeFirst的服务发布方式。
CXF使用
提供服务实现类
public interface HelloImpl {
public String sayHello() {
return "hello";
}
}
服务类的接口类
public interface Hello {
String sayHello();
}
测试服务类
import org.apache.cxf.frontend.ServerFactoryBean;
// Create our service implementation
HelloWorldImpl helloWorldImpl = new HelloWorldImpl();
// Create our Server
ServerFactoryBean svrFactory = new ServerFactoryBean();
svrFactory.setServiceClass(Hello.class);
svrFactory.setAddress("http://localhost:8080/Hello") ;
svrFactory.setServiceBean(helloWorldImpl);
svrFactory.create();
服务安全性
数字证书
Ø 相当于身份证件,数字证书是在IE中做为一种身份标识的。
Ø 由于Internet网电子商务系统技术使在网上购物的顾客能够极其方便轻松地获得商家和企业的信息,但同时也增加了对某些敏感或有价值的数据被滥用的风险. 为了保证互联网上电子交易及支付的安全性,保密性等,防范交易及支付过程中的欺诈行为,必须在网上建立一种信任机制。这就要求参加电子商务的买方和卖方都必须拥有合法的身份,并且在网上能够有效无误的被进行验证。数字证书是一种权威性的电子文档。它提供了一种在Internet上验证您身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构----CA证书授权(Certificate Authority)中心发行的,人们可以在互联网交往中用它来识别对方的身份。当然在数字证书认证的过程中,证书认证中心(CA)作为权威的、公正的、可信赖的第三方,其作用是至关重要的。
Ø 数字证书也必须具有唯一性和可靠性。为了达到这一目的,需要采用很多技术来实现。通常,数字证书采用公钥体制,即利用一对互相匹配的密钥进行加密、解密。每个用户自己设定一把特定的仅为本人所有的私有密钥(私钥),用它进行解密和签名;同时设定一把公共密钥(公钥)并由本人公开,为一组用户所共享,用于加密和验证签名。当发送一份保密文件时,发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,这样信息就可以安全无误地到达目的地了。通过数字的手段保证加密过程是一个不可逆过程,即只有用私有密钥才能解密。公开密钥技术解决了密钥发布的管理问题,用户可以公开其公开密钥,而保留其私有密钥。
Ø 数字证书颁发过程一般为:用户首先产生自己的密钥对,并将公共密钥及部分个人身份信息传送给认证中心。认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内包含用户的个人信息和他的公钥信息,同时还附有认证中心的签名信息。用户就可以使用自己的数字证书进行相关的各种活动。数字证书由独立的证书发行机构发布。数字证书各不相同,每种证书可提供不同级别的可信度。可以从证书发行机构获得您自己的数字证书。
Ø 目前的数字证书类型主要包括:个人数字证书、单位数字证书、单位员工数字证书、服务器证书、VPN证书、WAP证书、代码签名证书和表单签名证书。
Ø 随着Internet的普及、各种电子商务活动和电子政务活动的飞速发展,数字证书开始广泛地应用到各个领域之中,目前主要包括:发送安全电子邮件、访问安全站点、网上招标投标、网上签约、网上订购、安全网上公文传送、网上缴费、网上缴税、网上炒股、网上购物和网上报关等。
数字签名
相当于在现实社会中给文件签名那种。
简单地说,所谓数字签名就是附加在数据单元上的一些数据,或是对数据单元所作的密码变换。这种数据或变换允许数据单元的接收者用以确认数据单元的来源和数据单元的完整性并保护数据,防止被人(例如接收者)进行伪造。它是对电子形式的消息进行签名的一种方法,一个签名消息能在一个通信网络中传输。基于公钥密码体制和私钥密码体制都可以获得数字签名,目前主要是基于公钥密码体制的数字签名。包括普通数字签名和特殊数字签名。普通数字签名算法有RSA、ElGamal、Fiat-Shamir、Guillou- Quisquarter、Schnorr、Ong-Schnorr-Shamir数字签名算法、Des/DSA,椭圆曲线数字签名算法和有限自动机数字签名算法等。特殊数字签名有盲签名、代理签名、群签名、不可否认签名、公平盲签名、门限签名、具有消息恢复功能的签名等,它与具体应用环境密切相关。显然,数字签名的应用涉及到法律问题,美国联邦政府基于有限域上的离散对数问题制定了自己的数字签名标准(DSS)。一些国家如法国和德国已经制定了数字签名法。