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服务,访问看看是否正常。
分享到:
相关推荐
eclipse下spring+xfire实现ws-...数字签名和报文加密的安全认证,唯一不足的是没有实现数字签名和报文加密的混合模式(可能是密匙文件的问题,正在努力中),如果有疑问或更好的建议,请联系我,邮箱: windjie8@163.com
XFire中实现WS-SecurityXFire中实现WS-SecurityXFire中实现WS-Security
xfire+spring+安全认证,包含服务端和客户端,xfire jar包可以从我的资源下面下或网上很多。
xfire+spring+webservice+client xfire+spring+webservice+client xfire+spring+webservice+client
xfire+spring开发webservice 很不错的文档
基于XFire实施WS-Security,学习web service的材料
1 支持一系列Web Service的新标准--JSR181、WSDL2.0 、JAXB2、WS-Security等; 2 使用Stax解释XML,性能有了质的提高。XFire采用Woodstox 作Stax实现; 3 容易上手,可以方便快速地从pojo发布服务; 4 支持...
NULL 博文链接:https://zhaoshijie.iteye.com/blog/839050
xfire1.2.6 ws-security示例,也就是让里面的例子跑起来,网上都没这个教程,所以我就花了点点时间做了一下
xfire+spring+webservice xfire+spring+webservice xfire+spring+webservice xfire+spring+webservice
xfire-spring-1.2.6-sources.jarxfire-spring-1.2.6-sources.jar
XFire中实现WS-Security完整编 Spring+xFire+wss4j配置Helloworld实例 完整说明文档 Myeclipse项目 服务端工程 客户端工程
使用XFire+Spring构建Web Service使用XFire+Spring构建Web Service使用XFire+Spring构建Web Service使用XFire+Spring构建Web Service使用XFire+Spring构建Web Service使用XFire+Spring构建Web Service
webservice教程(xfire+spring)webservice教程(xfire+spring)webservice教程(xfire+spring)webservice教程(xfire+spring)
使用XFire+Spring构建Web Service步骤以及源代码.rar
xfire+spring webservice
xfire+Spring整合发布webservice,详细解释配置过程,及是替代码,帮助一部分需要这方面开发的人员。
使用XFire+Spring使用XFire+Spring构建Web Service(二).doc构建使用XFire+Spring构建Web Service(二).docWeb Service(二).doc
xfire 实施ws-security代码,多线程发送邮件工具类代码
spring+xfire( 编写webservice完整配置+案例)