`
fantasyeye
  • 浏览: 64180 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

xFire + Spring 实现 WS-Security[数字签名和报文加密] 服务端配置详解

 
阅读更多

xFire 实现数字签名及报文加密配置开发说明 - 服务端:

 

服务端配置:

1、先创建 xFire 配置信息的 xml 文件,文件名可自行定义,配置文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
	<!-- 引入 xFire 的 xml 配置文件及默认设置 -->
	<import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>
	<bean id="baseWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter" lazy-init="false" abstract="true">
		<property name="serviceFactory" ref="xfire.serviceFactory"/>
		<property name="xfire" ref="xfire"/>
	</bean>
                <!-- WebService 服务定义 -->
	<bean parent="baseWebService">
		<property name="serviceClass" value="服务接口" /><!-- 服务接口 -->
		<property name="serviceBean" ref="实现类ID" /><!-- 接口具体实现类 -->
		<property name="name" value="ServiceName"/><!-- WebService 名称 -->
		
		<!-- 对输入流的操作 -->
		<property name="inHandlers">
			<list>
				<ref bean="domInHandler"/><!-- 负责将STAX流模型的SOAP转换为DOM模型类 -->
				<ref bean="wss4jInHandler"/><!-- 对输入流的具体操作 -->
			</list>
		</property>
		
		<!-- 对输出流的操作 -->
		<property name="outHandlers">
	     	<list>
	     		<ref bean="domOutHandler"/> 
	     		<ref bean="wss4jOutHandler"/><!-- 对输出流的具体操作 -->
	     	</list>
	     </property>
	</bean>
	<!-- 接口实现类 -->
	<bean id="实现类ID" class="接口具体实现类" />
	
	<!-- 输入流模型处理类 -->
	<bean name="domInHandler" class="org.codehaus.xfire.util.dom.DOMInHandler"/>
	<!-- 输入流操作处理类 -->
	<bean name="wss4jInHandler" class="org.codehaus.xfire.security.wss4j.WSS4JInHandler">
		<property name="properties">
			<props>
				<prop key="action">Signature Encrypt Timestamp</prop><!-- 认证类型 组合操作,空格分隔  Encrypt(解密), Signature(验证签名)-->
				<prop key="signaturePropFile">insecurity_sign.properties</prop><!-- 验证签名须使用的 Client 数字证书, 属性文件必须提供访问密钥库中 Client 数字证书的相关配置 -->
				<prop key="decryptionPropFile">insecurity_enc.properties</prop><!-- 解密须使用的私钥, 属性文件必须提供配置访问密钥库中私钥的相关配置 -->
				<prop key="passwordCallbackClass">密码回调实现类</prop><!-- 输入密码回调实现类 action 类型为 Encrypt, 才会使用到, 提供私钥密码 -->
			</props>
		</property>
	</bean>
	
	<!-- 输出流模型处理类 -->
	<bean id="domOutHandler" class="org.codehaus.xfire.util.dom.DOMOutHandler"/>
	<!-- 加密方式处理类 -->
	<bean id="wss4jOutHandler" class="org.codehaus.xfire.security.wss4j.WSS4JOutHandler">
	     <property name="properties">
	     	<props>
	     		<prop key="action">Signature Encrypt Timestamp</prop>	     		
	     		<!--  -->
	     		<prop key="encryptionUser">enc_public_key</prop><!-- 请求加密的用户名 此用户名在接受端为接受响应的用户名. action 中存在 Encrypt 动作, 需要配置此信息  -->
	     		<prop key="encryptionPropFile">outsecurity_enc.properties</prop><!-- 加密, 在 action 属性设置中存在 Encrypt 须设置 -->
                                                <prop key="signaturePropFile">outsecurity_sign.properties</prop><!-- 签名, 在 action 属性设置中存在 Signature 须设置 -->
	     		<!-- 请求端发送过来的加密用户名 可用于密码回调类中根据用户名获取密码 -->
	     		<prop key="user">sign_private_key</prop><!-- 签名属性设置, 使用 Client 私钥进行签名, 接收端使用其公钥验证签名 -->
	     		<prop key="passwordCallbackClass">密码回调实现类</prop><!-- 输出密码回调类, 配合 action 设置的 Encrypt 使用 -->
	     	
	     		<prop key="enableSignatureConfirmation">false</prop><!-- 客户端设置必须与服务端设置相同 -->
	     		<!-- <prop key="signatureKeyIdentifier">DirectReference</prop>
	     		<prop key="encryptionKeyIdentifier">DirectReference</prop> -->
	     	</props>
	     </property>
	</bean>

</beans> 

如果对输入不是加密过的, 可以注释掉 inHandlers 的引用。 inHandlers 中对输入流的 action 类型及顺序必须与输出端也就是请求段的 action 相同。

如果对输出流没有加密要求, 可以注释掉 outHandlers 的引用。此设置的要求与 inHandlers 一样。

inHandlers 、outHandlers 均为可选。

action 属性说明:

Encrypt:加密、解密。

当 action 配置有该动作时,需要设置 encryptionUser 使用加密用户的名称,此值为 xxx_enc.properties 文件中, 指定密钥库中的公钥的别名(alias)。当客户端使用该别名公钥加密, 在服务端也要使用该别名的私钥进行解密操作。此公钥由密钥库使用 keytool 命令导出, 再导入到客户端使用的密钥库中。

Signature:签名、验签。

当 action 配置该动作时,需要设置 user 使用的签名用户名称,此值为 xxx_sign.properties 文件中, 指定密钥库中的私钥的别名(alias)。当客户端使用该私钥签名时, 在服务端也要使用该别名的公钥进行验签。

 

2、insecurity_sign.properties、insecurity_enc.properties、outsecurity_enc.properties、outsecurity_sign.properties 文件内容格式一样, 格式如下:

org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
#密钥库类型
org.apache.ws.security.crypto.merlin.keystore.type=jks
#密钥库访问密码
org.apache.ws.security.crypto.merlin.keystore.password=keyPassword
#密钥库文件位置
org.apache.ws.security.crypto.merlin.file=keystore.jks

 keystore.jks:密钥库文件

 keyPassword:密钥库密码

 

3、密码回调实现类, 该类实现 javax.security.auth.callback.CallbackHandler 接口, 实现 handle 方法, 代码如下:

public class 密码回调实现类 implements CallbackHandler {
	
	/**
	 * @Fields passwords 保存用户名和密码对应关系
	 */
	private Map<String, String> passwords = new HashMap<String, String>();
	
	public InPasswordCallbackHandler(){
		passwords.put("用户名", "密码"); 
	}

	/** 
	 * @see javax.security.auth.callback.CallbackHandler#handle(javax.security.auth.callback.Callback[])
	 */
	public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
		
		WSPasswordCallback pc = (WSPasswordCallback)callbacks[0];
		/*
		 * 获取请求的用户名
		 * 输入端:
		 * 此处获取的用户名为输出(请求)端配置项 encryptionUser 设置的用户名。针对输入(响应)端,获取密码是为了解密。
		 * 输出端:
		 * 此处获取的用户名为配置项 user 设置的用户名。针对输出端口,获取密码是为了加密。
		 */
		String id = pc.getIdentifer();
		// 根据用户名获取密码 
		pc.setPassword(passwords.get(id));
		
	}
}

    如果输出端设置了密码为 123456. 则输入端的密码也必须与输出端一致。WSPasswordCallback.getIdentifer()方法是能够获取请求来的用户名(encryptionUseh属性设置的值),而密码回调类可以通过配置Map类型变量事先存好用户名对应的密码,从而动态的根据用户名获取其密码。

在请求时,根据用户名获取其密码,对报文加密。而对与响应时,则是根据用户名获取密码,对其报文解密。

 

4、在 web.xml 文件中加入 xFire 配置,配置如下:

<!-- 在 Spring 监听器加载参数中加入 xFire 相关的配置文件 -->
<context-param>
    <param-name>contextConfigLocation</param-name>   
         <param-value>classpath*:org/codehaus/xfire/spring/xfire.xml, 自定义的xFire配置文件</param-value>
</context-param>

<!-- 添加 xFire Servlet 配置 -->
<servlet>   
    <servlet-name>XFireServlet</servlet-name>   
    <display-name>XFire Servlet</display-name>   
    <servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class>
</servlet>            
<servlet-mapping>   
    <servlet-name>XFireServlet</servlet-name>   
    <url-pattern>/services/*</url-pattern>   
</servlet-mapping>

  以上以对服务端配置完成,启动Web服务,访问看看是否正常。

分享到:
评论

相关推荐

    xfire+spring实现ws-security(数字签名和报文加密)

    eclipse下spring+xfire实现ws-...数字签名和报文加密的安全认证,唯一不足的是没有实现数字签名和报文加密的混合模式(可能是密匙文件的问题,正在努力中),如果有疑问或更好的建议,请联系我,邮箱: windjie8@163.com

    XFire中实现WS-Security经典

    WS-Security(Web Services Security)是 Oasis 标准组织定义的一套用于保护Web服务交互的安全规范,它提供了消息认证、加密和签名等功能,确保数据的机密性、完整性和身份验证。 描述中的重复内容进一步强调了主题...

    xfire+spring+安全认证

    "xfire+spring+安全认证"的主题聚焦于如何利用XFire和Spring框架来实现安全的Web服务。XFire是一个用于创建、消费和部署SOAP Web服务的Java库,而Spring框架则是一个广泛使用的全功能应用开发框架,提供了包括安全性...

    xfire1.2.6 ws-security示例

    在这个示例中,我们将探讨如何在xfire1.2.6中实现和应用WS-Security。 WS-Security标准由OASIS(Organization for the Advancement of Structured Information Standards)制定,旨在提供一种在SOAP消息层进行安全...

    基于XFire实施WS-Security

    综上所述,基于XFire实施WS-Security是实现Web Service安全的重要途径,它利用WS-Security标准在应用层提供了一套完整的安全策略。通过WSS4J和XFire的Handler机制,开发人员可以方便地对SOAP报文进行加密、签名和...

    xfire+spring+webservice+client

    总结来说,"xfire+spring+webservice+client"是一个关于利用Spring和XFire集成实现Web服务客户端的议题,涵盖了从Web服务的基本概念到具体实现的多个层次。通过理解这些知识点,开发者可以有效地构建和维护自己的Web...

    ws-security java-mail

    在SOAP消息中,`ws-security` 可以添加数字签名、加密、时间戳等元素,确保数据在传输过程中的安全。例如,`ws-security` 可以通过X.509证书进行公钥基础设施(PKI)的认证,也可以使用UsernameToken或 Kerberos ...

    xfire+spring开发webservice

    在提供的文档《xfire+spring2_5开发webservice接口的两种方式.mht》中,详细讲解了这两种方法的实现步骤、示例代码和注意事项。读者可以通过阅读该文档,了解如何在Spring 2.5版本下结合XFire创建Web服务。 另一份...

    Webservice实现WS-Security(XFire)

    NULL 博文链接:https://zhaoshijie.iteye.com/blog/839050

    xfire-spring-1.2.6-sources.jar

    xfire-spring-1.2.6-sources.jarxfire-spring-1.2.6-sources.jar

    xfire+spring+webservice

    3. 创建Web服务:使用XFire提供的API或Spring-WS的注解来定义Web服务接口和实现。 4. 暴露服务:通过Spring的ApplicationContext,将Web服务发布到指定的URL。 5. 测试和调用:使用客户端工具(如cURL或测试类)进行...

    使用XFire+Spring构建Web Service

    3. **配置XFire**:在Spring配置文件中配置XFireBean,指定服务接口和实现类。 4. **启动服务**:通过Spring容器启动XFire服务发布器,服务即可对外提供。 5. **创建客户端**:使用XFire生成的客户端Stubs,调用服务...

    spring+xfire( 编写webservice完整配置+案例)

    这个案例中的压缩包文件可能包含了上述所有步骤的源代码示例,包括Spring配置文件、Java接口和实现类,以及可能的测试脚本。通过学习和分析这些文件,你可以更好地理解Spring和XFire如何协同工作,以及如何在实际...

    Spring+xFire+wss4j配置Helloworld完整版,Myeclipse项目服务端+客户端.rar

    项目中包含的`Spring+xFire+wss4j配置Helloworld完整版.doc`文档,应该详细阐述了每个步骤,包括项目结构、配置文件的设置以及如何运行服务端和客户端。而`xalan.jar`是一个XSLT处理库,可能在转换XML文档时被用到。...

    XFire+Spring webwervice

    XFire作为一个现代化的Web服务框架,它与Axis2齐名,但因其简洁的API和对Web服务标准的支持,如JSR181、WSDL2.0、JAXB2和WS-Security,受到了开发者的青睐。此外,XFire使用Stax解析XML,提高了性能,尤其是当它与...

    xfire spring security

    《xfire与Spring Security整合实现WS-Security安全认证详解》 在现代企业级应用开发中,安全性是不可或缺的重要环节。Spring Security作为Java领域的安全框架,提供了全面的身份验证和授权服务。而Xfire(现已被...

    xfire+spring+maven构建webservice服务器和客户端

    标题中的“xfire+spring+maven构建webservice服务器和客户端”揭示了本教程将围绕三个主要技术进行讨论:XFire、Spring和Maven。这三者都是Java开发中不可或缺的工具,尤其在构建Web服务方面。 XFire是早期的一个...

    xfire+spring+hibernate的一种整合方式

    本案例中的"xfire+spring+hibernate"是一种早期的整合方式,它将Web服务(通过XFire实现)、Spring框架的依赖注入与管理以及Hibernate的持久层处理结合在一起。以下是对这种整合方式的详细解释。 1. **XFire**:...

    xfire +spring jar

    描述中提到的“本来想把xfire+spring例子也一起传上来,太大不让传”,意味着这个压缩包可能包含了示例代码或者项目实例,用于展示如何在实际应用中整合XFire和Spring。由于文件大小限制未能一同上传,我们只能从...

Global site tag (gtag.js) - Google Analytics