WS-Security全称为Web Services Security,是一套针对SOAP消息安全的XML规范,由OASIS组织制定和维护,旨在为Web服务通信提供标准化的安全保障机制。它通过在SOAP消息头部嵌入安全相关的XML元素,实现消息层面的安全控制,不需要依赖传输层协议的安全特性,适配多种不同的传输场景。

WS-Security的核心能力
WS-Security主要提供三类核心安全能力,覆盖SOAP消息从生成到接收的全流程安全需求:
- 身份认证:支持多种身份凭证的嵌入,包括用户名令牌、X.509数字证书、SAML断言等,接收方可以通过解析头部凭证验证发送方身份。
- 数据完整性:通过数字签名技术对SOAP消息的关键部分进行签名,接收方验证签名可以确认消息在传输过程中没有被篡改。
- 数据保密性:使用对称或非对称加密算法对SOAP消息的敏感内容进行加密,只有持有对应密钥的接收方才能解密读取内容。
WS-Security的XML规范结构
WS-Security的所有安全信息都封装在SOAP消息头的wsse:Security元素中,该元素属于http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd命名空间。一个典型的包含WS-Security头的SOAP消息结构如下:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<soap:Header>
<wsse:Security>
<!-- 用户名令牌示例 -->
<wsse:UsernameToken wsu:Id="UsernameToken-1">
<wsse:Username>test_user</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">test_pwd</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
<soap:Header>
<soap:Body>
<test:queryData xmlns:test="http://example.org/test">
<test:param>查询参数</test:param>
</test:queryData>
</soap:Body>
</soap:Envelope>
WS-Security的常见使用场景
WS-Security通常用于对安全性要求较高的企业级Web服务场景,比如:
- 金融行业的支付接口对接,需要保证交易消息不被篡改和窃取。
- 企业内部系统之间的服务调用,需要验证调用方身份,避免非法访问。
- 跨企业的供应链服务对接,需要符合行业安全规范,保障数据合规传输。
WS-Security与其他安全机制的区别
很多开发者会混淆WS-Security和HTTPS的作用,两者的核心差异在于安全作用的层级不同:
| 对比维度 | WS-Security | HTTPS |
|---|---|---|
| 作用层级 | 消息层安全 | 传输层安全 |
| 安全范围 | 仅保护SOAP消息本身,消息存储后安全依然有效 | 仅保护传输过程,消息到达后安全失效 |
| 依赖协议 | 不依赖传输协议,可适配HTTP、SMTP等多种协议 | 依赖HTTP协议,只能用于HTTP传输场景 |
| 安全能力 | 支持身份认证、签名、加密、时间戳等多种能力 | 仅提供传输加密和服务器身份认证 |
WS-Security的实现注意事项
在实际开发中实现WS-Security时,需要注意以下几点:
- 密钥和凭证的管理要规范,避免硬编码在代码中,建议使用专业的密钥管理服务存储。
- 时间戳的配置要合理,设置合适的消息有效期,避免重放攻击。
- 签名和加密的范围要明确,不要对无关的消息部分做处理,避免不必要的性能损耗。
- 不同版本的WS-Security规范存在差异,对接时要确认双方使用的规范版本一致。
如果使用Java语言开发,可以借助Apache WSS4J框架快速实现WS-Security的相关功能,以下是一个简单的客户端签名配置示例:
import org.apache.wss4j.common.crypto.Crypto;
import org.apache.wss4j.common.crypto.CryptoFactory;
import org.apache.wss4j.dom.message.WSSecHeader;
import org.apache.wss4j.dom.message.WSSecSignature;
import org.w3c.dom.Document;
import java.util.Properties;
public class WsSecurityClient {
public Document signSoapMessage(Document soapDoc) throws Exception {
// 加载密钥配置
Properties cryptoProps = new Properties();
cryptoProps.put("org.apache.wss4j.crypto.provider", "org.apache.wss4j.common.crypto.Merlin");
cryptoProps.put("org.apache.wss4j.crypto.merlin.keystore.type", "jks");
cryptoProps.put("org.apache.wss4j.crypto.merlin.keystore.file", "client.keystore");
cryptoProps.put("org.apache.wss4j.crypto.merlin.keystore.password", "keystore_pwd");
Crypto crypto = CryptoFactory.getInstance(cryptoProps);
// 创建安全头
WSSecHeader secHeader = new WSSecHeader(soapDoc);
secHeader.insertSecurityHeader();
// 配置签名
WSSecSignature signer = new WSSecSignature(secHeader);
signer.setUserInfo("client_alias", "key_pwd");
signer.setSignatureAlgorithm("http://www.w3.org/2001/04/xmldsig-more#rsa-sha256");
signer.setDigestAlgorithm("http://www.w3.org/2001/04/xmlenc#sha256");
// 执行签名
return signer.build(crypto);
}
}
WS-Security作为标准化的SOAP消息安全规范,已经成为企业级Web服务安全的事实标准,掌握它的核心原理和实现方式,能够帮助开发者更好地应对Web服务场景下的安全需求,避免常见的安全漏洞。
WS-SecuritySOAP消息安全XML规范Web服务安全修改时间:2026-06-27 15:54:32