Apache WSS4J 开源项目教程
项目介绍
Apache WSS4J 是一个用于处理 Web 服务安全(WS-Security)的开源项目,它实现了 OASIS Web Services Security 标准。WSS4J 提供了对 SOAP 消息进行加密、签名和验证的功能,确保消息在传输过程中的安全性和完整性。该项目广泛应用于需要安全通信的 Web 服务和企业级应用中。
项目快速启动
环境准备
- Java 8 或更高版本
- Maven 3.x
快速启动代码
-
克隆项目
git clone https://github.com/apache/ws-wss4j.git cd ws-wss4j
-
构建项目
mvn clean install
-
创建一个简单的 SOAP 服务
创建一个 Maven 项目,并在
pom.xml
中添加 WSS4J 依赖:<dependency> <groupId>org.apache.wss4j</groupId> <artifactId>wss4j-ws-security-common</artifactId> <version>2.4.1</version> </dependency>
-
配置安全策略
创建一个安全策略文件
security_policy.xml
:<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"> <sp:AsymmetricBinding> <wsp:Policy> <sp:InitiatorToken> <wsp:Policy> <sp:X509Token sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient"> <sp:WssX509V3Token10/> </sp:X509Token> </wsp:Policy> </sp:InitiatorToken> <sp:RecipientToken> <wsp:Policy> <sp:X509Token sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/Never"> <sp:WssX509V3Token10/> </sp:X509Token> </wsp:Policy> </sp:RecipientToken> <sp:AlgorithmSuite> <wsp:Policy> <sp:Basic256/> </wsp:Policy> </sp:AlgorithmSuite> <sp:Layout> <wsp:Policy> <sp:Lax/> </wsp:Policy> </sp:Layout> <sp:IncludeTimestamp/> </wsp:Policy> </sp:AsymmetricBinding> </wsp:Policy>
-
使用 WSS4J 处理 SOAP 消息
在服务端和客户端代码中使用 WSS4J 处理 SOAP 消息的安全性。
import org.apache.wss4j.common.ext.WSSecurityException; import org.apache.wss4j.dom.handler.RequestData; import org.apache.wss4j.dom.message.WSSecHeader; import org.apache.wss4j.dom.message.WSSecSignature; import org.apache.wss4j.dom.message.WSSecEncrypt; import org.apache.wss4j.dom.engine.WSSecurityEngine; public class WSS4JExample { public static void main(String[] args) throws WSSecurityException { // 创建安全头 WSSecHeader secHeader = new WSSecHeader(); secHeader.insertSecurityHeader(document); // 创建签名 WSSecSignature sign = new WSSecSignature(); sign.setUserInfo("alice", "password"); sign.build(document, crypto, sec