WS-Security是SOAP的扩展,用于通过XML签名和XML加密将安全性应用于Web服务。
如何从.p12文件生成BinarySecurityToken(X509PKIPathv1)
我正在尝试从 C# 客户端使用 Java Web 服务。该服务需要值类型为 X509PKIPathv1 的 BinarySecurityToken 元素。 我正在尝试从 C# 客户端使用 Java Web 服务。该服务需要值类型为 BinarySecurityToken 的 X509PKIPathv1 元素。 <wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509PKIPathv1"> MIIH...... </wsse:BinarySecurityToken> 由于 WCF 不支持 X509PKIPathv1 值类型,因此我手动生成 SOAP 消息,使用 SignedXml 类对其进行签名,使用 EncryptedXml 对其进行加密,并使用 WebClient 类发送它。至于 BinarySecurityToken 元素的值,我使用了 SoapUI 中为同一证书生成的值,并且它有效。 但是,我希望能够以编程方式从 .p12 文件生成此值,而不必每次证书过期时都从 SoapUI 再次粘贴它。 WS-Security 文档有点模糊,所以我不知道如何去做。这是它提供的有关此令牌类型的所有信息: #X509PKIPathv1:打包在 PKIPath 中的 X.509 证书的有序列表 如何在 C# 中从 .p12 文件生成该值? SoapUI 以某种方式做到了。 所以这可能不能完全解决您的问题,但可能会对您有所帮助。 这个: #X509PKIPathv1:打包在 PKIPath 中的 X.509 证书的有序列表 means 是您用来签署消息的 asn1 序列或证书链。您甚至可以在这里看到它。 给出一些上下文asn1是一种以独立于您正在使用的机器的方式表示数据的方式。该数据是二进制的,不是人类可读的,因此您将其转换为 bade 64,这就是您在该字段中看到的内容。 我不完全确定您的 .p12 文件的确切内容是什么,但至少我认为它具有您用于签署消息的私钥的证书,也许还有公共信任证书或 CA 之前的链. 我主要是一名 C++ 开发人员,我知道 openssl 提供了一个类似 C 的 api 来读取证书操作底层的 asn1 结构并将其输出为字符串。 很抱歉没有提供更详细的信息或代码示例 基于asn1,需要以SEQUENCE标签(0x30)开始,然后编码序列的长度。 C# 代码(假设您的证书链不是太长: byte[] X509toPKIPath(X509Certificate2 source) { X509Chain chain = new X509Chain(); chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag; chain.Build(source); MemoryStream ms = new MemoryStream(); ms.Write(new byte[] { 0x30, 0x82, 0x00, 0x00 }, 0, 4); // should be == ; order seem to be CA -> leaf, not other way around if (chain.ChainElements.Count > 0 && chain.ChainElements[0].Certificate.IssuerName.Name == chain.ChainElements[0].Certificate.Subject) { foreach (X509ChainElement element in chain.ChainElements) { byte[] leaf = element.Certificate.Export(X509ContentType.Cert); ms.Write(leaf, 0, leaf.Length); } } else { for (int i = chain.ChainElements.Count - 1; i >= 0; i--) { byte[] leaf = chain.ChainElements[i].Certificate.Export(X509ContentType.Cert); ms.Write(leaf, 0, leaf.Length); } } ms.Seek(2, SeekOrigin.Begin); ms.WriteByte((byte)((ms.Length - 4) / 256)); ms.WriteByte((byte)((ms.Length - 4) % 256)); return ms.ToArray(); } 我找不到任何关于如何订购链的明确规范,因此从 CA 根到证书可能有点过分了
使用 spring-ws 验证 SOAP 服务中的请求签名和签名响应
前提:我需要创建一个使用 WS-Security 标准的 SOAP 服务来执行标题中描述的操作,以便 SOAP 客户端可以使用该服务。 我有什么 肥皂服务已完成
我正在尝试使用 WSO2 Micro Integrator 自定义由使用 ws-security 策略(使用自定义 Rampart 配置)配置的代理服务返回的错误响应。例如,如果客户端发送
如何在不知道服务器证书的情况下使用 WS-SECURITY 通过 WCF 使用 Web 服务
为了创建一个使用 WCF 来使用实现 WS-SECURTY 的 Web 服务的 .Net 客户端,我创建了一个 CustomBinding,并向其中添加了三个元素: 非对称安全绑定元素
CXF 的 WS-security(用户名令牌) - 可以加密密码吗?
我正在尝试与 CXF 的 WS 安全实现(用户名令牌)结合在一起。我已经按照 http://cxf.apache.org/docs/ws-security.html 中所述完成了所有操作。我的PasswordCallbackHandler似乎是
如何在wss4j 1.6中验证没有密码的UsernameToken?
如果我发送具有当前结构的标头: 如果我发送具有当前结构的标头: <soapenv:Header> <wsse:Security 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" soapenv:mustUnderstand="1"> <wsse:UsernameToken wsu:Id="UsernameToken-E9505BCB2A7771EF1F14710742072404"> <wsse:Username>Not_correct_username</wsse:Username> </wsse:UsernameToken> </wsse:Security> </soapenv:Header> 通过 processSecurityHeader 方法执行的验证是正确的。但我想仅通过用户名来验证用户。 现在我的CallbackHandler代码是: public class PWCallback implements CallbackHandler { private String user; private String password; private String alias; private String privateKeyPassword; @Override public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { for (int i = 0; i < callbacks.length; i++) { if (callbacks[i] instanceof WSPasswordCallback) { WSPasswordCallback pc = (WSPasswordCallback) callbacks[i]; if (pc.getUsage() == WSPasswordCallback.USERNAME_TOKEN) { if (!StringUtils.equals(user, pc.getIdentifier())) { throw new IOException("unknown user: " + pc.getIdentifier()); } pc.setPassword(password); } else { if (pc.getUsage() == WSPasswordCallback.SIGNATURE || pc.getUsage() == WSPasswordCallback.DECRYPT) { if (StringUtils.equals(pc.getIdentifier(), alias)) { pc.setPassword(privateKeyPassword); } else throw new IOException("unknown user: " + pc.getIdentifier()); } } } } } 我必须添加或删除什么? 您需要重写默认 UsernameTokenValidator 的“verifyUnknownPassword”方法来调用您的 CallbackHandler。
是否可以使用 PSHA1 (http://schemas.xmlsoap.org/ws/2005/02/trust/CK/PSHA1) 密钥来使用 XML 加密? 我有两个秘密并使用它们生成 PSHA1 密钥字符串,但是失败并显示:
我无法在 PHP 中发出加密的 SOAP 请求。 根据文档,我对支付网关的每个请求进行了加密。我生成了 CSR 并将其发送给证书颁发机构...
尝试使用服务器的 PrivateKey 和 TrustedCert 的密钥库条目为 Web 服务客户端实现 WSS。 出站请求的拦截器代码如下所示。 // 传出
WCF 客户端无法验证 Java Web 服务。找不到 X509SecurityToken 的令牌验证器
我创建了集成Java WS的WCF客户端。这个想法很简单。我应该使用客户端的证书签署我的请求,服务器应该返回签名的响应。由服务器私钥签名...
我需要在 Jmeter 中放置一个测试 SOAP。该测试由 Jmeter 元素“SOAP Message Signer”进行签名。 我签署时间戳、正文和二进制安全令牌。 当我发送测试时,该测试发送得很好,但我不是......
我正在尝试将 UsernameToken wss 标头添加到我的 ws 客户端。 客户端实现 javax.xml.ws.Service 并已通过 WSDL2Java CFX 3.1.4 生成 由于 wsdl 包含 我正在尝试将 UsernameToken wss 标头添加到我的 ws 客户端。 客户端实现了 javax.xml.ws.Service 并已通过 WSDL2Java CFX 3.1.4 生成 由于 wsdl 包含 <wsp:Policy xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy" wsu:Id="UsernameTokenPolicy"> <sp:UsernameToken> <wsp:Policy> <sp:WssUsernameToken10/> <sp:HashPassword/> </wsp:Policy> </sp:UsernameToken> </wsp:Policy> 必须添加 Usernametoken 标头。搜索了一下,我发现这很简单 ((BindingProvider)soapClient).getRequestContext().put("ws-security.username", usr); ((BindingProvider)soapClient).getRequestContext().put("ws-security.password", psw); 顺便说一下,当我尝试执行呼叫时,出现以下错误: These policy alternatives can not be satisfied: {http://schemas.xmlsoap.org/ws/2005/07/securitypolicy}UsernameToken: Password hashing policy not enforced 有什么建议吗? 谢谢你。 附注我已经在堆栈溢出中检查过类似的帖子,但是如果我尝试像here建议的那样采用不同的方法,我会得到一个不同的错误: Interceptor for XXXX has thrown exception, unwinding now org.apache.cxf.ws.policy.PolicyException: No username available 如cxf-文档所述 从 Apache CXF 3.1.0 开始,WS-SecurityPolicy 和 XML 安全性 CXF 中的 (JAX-RS) 组件共享一组通用的配置标签。 所以你不应该使用ws-security.username和ws-security.password,而应该使用security.username和security.password 还要确保 cxf-rt-ws-policy 和 cxf-rt-ws-security 模块在类路径上可用,以便 ws-policy 将自动启用,从而负责对密码进行哈希处理,即计算正确的密码摘要。
处理标头时发现错误 顺便说一句,这是一个 WS-Security 问题... 我看不出我的 WS 端点有任何问题(除了它在
如何为 Weblogic 实现具有签名正文和时间戳的 Web 服务客户端
我正在尝试为启用了 WSS(签名正文和时间戳)的 Web 服务实现一个简单的 Web 服务客户端。这是 WSS 政策: 我正在尝试为启用了 WSS(签名正文和时间戳)的 Web 服务实现一个简单的 Web 服务客户端。这是 WSS 政策: <wsp:Policy wsu:Id="SignatureRequired" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"> <wsp:ExactlyOne> <wsp:All> <sp:AsymmetricBinding> <wsp:Policy> <sp:InitiatorToken> <wsp:Policy> <sp:X509Token sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient"> <wsp:Policy> <sp:WssX509V3Token10 /> </wsp:Policy> </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/AlwaysToInitiator"> <wsp:Policy> <sp:WssX509V3Token10 /> </wsp:Policy> </sp:X509Token> </wsp:Policy> </sp:RecipientToken> <sp:AlgorithmSuite> <wsp:Policy> <sp:TripleDesRsa15/> </wsp:Policy> </sp:AlgorithmSuite> <sp:Layout> <wsp:Policy> <sp:Strict /> </wsp:Policy> </sp:Layout> <sp:IncludeTimestamp /> </wsp:Policy> </sp:AsymmetricBinding> <sp:SignedParts> <sp:Body /> </sp:SignedParts> </wsp:All> </wsp:ExactlyOne> </wsp:Policy> 客户端实现基于 Oracle 文档中的示例:http://docs.oracle.com/cd/E24329_01/web.1211/e24488/message.htm#WSSOV273 Web 服务在 Weblogic 12c (12.1.2) 和 Oracle Java 1.7.0_25 上运行 package com.example.testclient.mtom; import weblogic.jws.jaxws.ClientPolicyFeature; import weblogic.jws.jaxws.policy.InputStreamPolicySource; import weblogic.security.SSL.TrustManager; import weblogic.xml.crypto.wss.api.Timestamp; import weblogic.xml.crypto.wss.api.WSSecurityFactory; import weblogic.xml.crypto.wss.provider.CredentialProvider; import weblogic.xml.crypto.wss.WSSecurityContext; import weblogic.wsee.security.bst.ClientBSTCredentialProvider; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.xml.namespace.QName; import javax.xml.ws.BindingProvider; import javax.xml.ws.soap.MTOMFeature; import org.apache.commons.lang.RandomStringUtils; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.ArrayList; import java.util.Map; import java.io.FileInputStream; import java.io.InputStream; import java.security.cert.X509Certificate; import com.example.attachment.TestWebServiceAttachment_Service; import com.example.attachment.TestWebServiceAttachment; public class TestWebServiceAttachmentClient { public TestWebServiceAttachmentClient() { // TODO Auto-generated constructor stub } public static void main(String[] args) throws Throwable { String username = "User"; String password = "Pass"; String clientCertFile = "src/main/resources/User.jks"; QName operationName = new QName("http://www.example.com/ws/attachment", "fileUpload"); MTOMFeature mtomFeature = new MTOMFeature(); InputStream is = new FileInputStream("src/main/resources/my-wssp1.1-signature-required.xml"); ClientPolicyFeature clientPolicyFeature = new ClientPolicyFeature(); clientPolicyFeature.setEffectivePolicyForOperation(operationName, new InputStreamPolicySource(is)); TestWebServiceAttachment_Service service = new TestWebServiceAttachment_Service(); TestWebServiceAttachment port = service.getTestWebServiceAttachmentPort(clientPolicyFeature, mtomFeature); //create credential provider and set it to the Stub List credProviders = new ArrayList(); //client side BinarySecurityToken credential provider -- x509 CredentialProvider cp = new ClientBSTCredentialProvider(clientCertFile, password, username, password); credProviders.add(cp); Date date = new Date(); Calendar created = Calendar.getInstance(); created.setTime(date); Calendar expired = Calendar.getInstance(); expired.setTime(date); expired.set(Calendar.HOUR_OF_DAY, created.get(Calendar.HOUR_OF_DAY) + 1); Timestamp timestamp = WSSecurityFactory.newTimestamp("TS-" + RandomStringUtils.randomNumeric(34), created, expired); Map<String, Object> requestContext = ((BindingProvider) port).getRequestContext(); requestContext.put(WSSConstants.TIMESTAMP_ELEMENT, timestamp); requestContext.put(WSSecurityContext.CREDENTIAL_PROVIDER_LIST, credProviders); requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://myserver:7001/ws/TestWebServiceAttachment/1.0"); requestContext.put(WSSecurityContext.TRUST_MANAGER, new TrustManager() { public boolean certificateCallback(X509Certificate[] chain, int validateErr) { // need to validate if the server cert can be trusted return true; } }); DataHandler dh = new DataHandler(new FileDataSource("src/main/resources/file1.pdf")); long response = port.fileUpload("file1.pdf", dh); System.out.println("response = " + response); } } 问题在于时间戳。我不知道如何正确地将时间戳签名添加到 WSS 上下文中。有谁知道如何实现这样的客户端?我收到以下异常: Exception in thread "main" com.sun.xml.ws.fault.ServerSOAPFaultException: Client received SOAP Fault from server: Timestamp validation failed. Please see the server log to find more detail regarding exact cause of the failure. at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:193) at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:125) at com.sun.xml.ws.client.sei.StubHandler.readResponse(StubHandler.java:253) at com.sun.xml.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:181) at com.sun.xml.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:258) at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:117) at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:91) at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:154) at com.sun.proxy.$Proxy37.fileUpload(Unknown Source) 我知道我的答案可能对你不再有用,但可能对其他人有帮助。 Weblogic 时间戳验证假定相应字段位于 UTC 时区。检查您的日期时间字段是否采用 UTC。 当没有时间戳字段或时间戳字段不正确时,服务器会显示 Timestamp validation failed 消息。您可以通过将以下行添加到代码中来查看您的原始 SOAP 请求: System.setProperty("com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true"); System.setProperty("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true"); System.setProperty("com.sun.xml.ws.transport.http.HttpAdapter.dump", "true"); System.setProperty("com.sun.xml.internal.ws.transport.http.HttpAdapter.dump". "true");
cxf 服务的自定义拦截器以允许 spring security 身份验证
我在我的应用程序中使用 Spring Security 进行身份验证,现在我正在使用 cxf 公开 Web 服务,并且我想使用 Spring Security 来验证当前的 Web 服务调用。但我需要加入...
我即将开发一个 Windows 应用程序,需要使用 Web 服务安全性与 Axis2 Web 服务进行通信 - 所有文档都说,SOAP 安全通信是
使用soapUI测试WS安全性 - 在消息负载中使用安全标头
我是 Web 服务和 WS Security 的新手。 我有一个使用 CFX 拦截器的示例 Web 服务。以下是我的配置文件。 Cfx-servelet.xml: ...
我有点脱离了自己的舒适区。我正在尝试使用 PHP 创建 SOAP 请求,并且使用著名的 KBO API,以下是文档: https://economie.fgov.be/sites/default/files/Fi...
如何确定 InclusiveNamespaces 元素的 PrefixList 属性的值
签署 SOAP 请求时,我应该如何确定需要在 InclusiveNamespaces 元素的 PrefixList 属性中列出哪些值? 我正在努力确保我所设定的...