我很难找到实现WS-Security的优秀Ruby库.我已经看过wss4r但尚未使用它(文档对它有点亮).您使用哪些库来完成此任务,或者有更好的替代方案?
我需要编写一个Web服务客户端来调用第三方Web服务(基于SOAP).第三方发布了wsdl和相关的xsd文件.
第三方使用.p12证书保护其网站和服务
我使用wsdl2java生成我的存根.我修改了端点并调用了服务.我收到以下错误:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header></SOAP-ENV:Header>
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">wsse:InvalidSecurity</faultcode>
<faultstring>SECU1075: An error was discovered processing the <wsse:Security> header</faultstring>
<detail>SECU3510: Signature requirements validation failed: Element (/soapenv:Envelope/soapenv:Body) was not signed</detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)
嗯,好的.有道理我应该签署文件.
奇怪的部分(对我来说)是WSDL文件中没有任何安全定义.这是正常的吗?我联系了第三方,他们向我发送了一个关于SOAP消息需要的pdf.标题中显示以下标记:包含:
<wsse:BinarySecurityToken>
Run Code Online (Sandbox Code Playgroud)
和
<dsig:SignedInfo>
Run Code Online (Sandbox Code Playgroud)
所以从我收集的内容来看,它需要我的证书和一些数字签名.
有人可以推荐如何在Java中生成这些?我开始沿着Axis2/Rampart路径开始,但老实说,似乎这些都是基于WSDL文件中定义的安全要求(如果我错了,请纠正我).
任何人都可以简要解释一下WS安全性所涉及的概念,以保护肥皂免受中间网络服
我有一个Web服务和他的客户端之间的安全性问题.我使用Axis2和Rampart构建自下而上的webservice,而不是从生成的wsdl创建客户端.我告诉你我的代码和具体问题.
Client.java
package de.security.tutorial;
import java.io.InputStream;
import java.rmi.RemoteException;
import javax.xml.stream.XMLStreamException;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.ConfigurationContextFactory;
import org.apache.neethi.Policy;
import org.apache.neethi.PolicyEngine;
import org.apache.rampart.RampartMessageData;
import de.security.tutorial.ServerStub.GetWelcomeResponse;
public class Client {
/**
* Load policy file from classpath.
*/
private static Policy loadPolicy(String name) throws XMLStreamException {
ClassLoader loader = new ClassLoader() {};
InputStream resource = loader.getResourceAsStream(name);
StAXOMBuilder builder = new StAXOMBuilder(resource);
return PolicyEngine.getPolicy(builder.getDocumentElement());
}
public static void main(String[] arg) throws RemoteException{
String url = "http://localhost:8080/axis2/services/Server";
try {
// …Run Code Online (Sandbox Code Playgroud) 今天,有越来越多的 Web 服务被开发供内部使用以将应用程序连接在一起。我们没有 ESB 来控制和保护这个 Web 服务,所以我想什么是保护它们的好方法。
我们尝试设置双向 SSL,但我们无法控制特定 Web 服务的授权。
我的需要是能够控制哪个应用程序正在调用我的 Web 服务,以及该应用程序是否有权调用它。
我不喜欢 WS-Trust 和 Ws-Security,因为这会改变原始 SOAP 消息,但似乎它们不是其他解决方案。
任何的想法?
谢谢
我正在尝试调用在 wsdl 中配置了用户名令牌的 Web 服务:
<sp:SupportingTokens><wsp:Policy><sp:UsernameToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:HashPassword/>
<sp:WssUsernameToken10/>
</wsp:Policy>
</sp:UsernameToken>
</wsp:Policy>
</sp:SupportingTokens>
Run Code Online (Sandbox Code Playgroud)
soap 请求包含以下用于身份验证的信息:
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>user</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header/>
<env:Body>
<env:Fault xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<faultcode>wsse:InvalidSecurity</faultcode>
<faultstring>Error on verifying message against security policy Error code:1000</faultstring>
</env:Fault>
</env:Body>
</env:Envelope>
Run Code Online (Sandbox Code Playgroud)
有人能告诉我我做错了什么吗?
谢谢你。
所以我将是第一个承认我对WS-Security内部知之甚少的人.我有一个SOAP服务工厂,如下所示.将此服务与内部仅测试.NET客户端一起使用时(通过svcutil.exe +自动生成的WSDL使用自动生成的.cs代理类)一切正常.我可以在第5个"实际"(加密)SOAP请求/响应之前看到前4个安全SOAP请求 - 响应握手对.我一般都了解安全性,但希望我知道有关此特定握手的详细信息 - 我猜他们正在进行密钥交换?
无论如何,部分是因为
我以为我应该通过HTTPS + HTTP基本身份验证进行SOAP交换.所以问题归结为
上面的跟进:如何将服务工厂配置为推荐设置?毋庸置疑,我希望远离Windows身份验证,这在互联网环境中毫无意义......
public class SoapServiceHostFactory : ServiceHostFactory
{
private Type serviceInterfaceType;
public SoapServiceHostFactory(Type serviceInterfaceType)
{
this.serviceInterfaceType = serviceInterfaceType;
}
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
ServiceHost host = base.CreateServiceHost(serviceType, baseAddresses);
ServiceMetadataBehavior smb = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
// Enable metadata
if (smb == null)
{
smb = new ServiceMetadataBehavior();
host.Description.Behaviors.Add(smb);
}
smb.HttpGetEnabled = true;
// Enable debugging for service
ServiceDebugBehavior sdb = host.Description.Behaviors.Find<ServiceDebugBehavior>();
if …Run Code Online (Sandbox Code Playgroud)我遇到了WS-Security的问题,并创建了一个正确的随机数和密码摘要.
我成功使用SoapUI将数据发送到Oracle系统.所以我能够拦截SoapUI的调用(将代理更改为127.0.0.1端口8888以使用Fiddler失败,因为它是通过SSL) - 拦截非常重要,因为这些值只能使用一次.然后我可以抓取nonce,创建时间戳和密码摘要将它们放入我的代码中(我只有30秒才能完成这个,因为值不会持续!)并且我获得了成功.
所以我知道它不是别的 - 只是密码摘要.
我使用的值如下:
Nonce: UIYifr1SPoNlrmmKGSVOug==
Created Timestamp: 2009-12-03T16:14:49Z
Password: test8
Required Password Digest: yf2yatQzoaNaC8BflCMatVch/B8=
Run Code Online (Sandbox Code Playgroud)
我知道创建摘要的算法是:
Password_Digest = Base64 ( SHA-1 ( nonce + created + password ) )
Run Code Online (Sandbox Code Playgroud)
使用以下代码(来自Rick Strahl的帖子)
protected string GetSHA1String(string phrase)
{
SHA1CryptoServiceProvider sha1Hasher = new SHA1CryptoServiceProvider();
byte[] hashedDataBytes = sha1Hasher.ComputeHash(Encoding.UTF8.GetBytes(phrase));
return Convert.ToBase64String(hashedDataBytes);
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
GetSHA1String("UIYifr1SPoNlrmmKGSVOug==" + "2009-12-03T16:14:49Z" + "test8") = "YoQKI3ERlMDGEXHlztIelsgL50M="
Run Code Online (Sandbox Code Playgroud)
我尝试了各种SHA1方法,都返回相同的结果(我猜这是件好事!):
SHA1 sha1 = SHA1.Create();
SHA1 sha1 = SHA1Managed.Create();
// Bouncy Castle:
protected string GetSHA1usingBouncyCastle(string phrase)
{
IDigest …Run Code Online (Sandbox Code Playgroud) 在我的肥皂应用程序中,我正在使用apache cxf。
这是我的代码,它将数据提交到服务器。
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.apache.cxf.bus.spring.SpringBusFactory;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.ws.security.wss4j.DefaultCryptoCoverageChecker;
import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor;
import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
SpringBusFactory bf = new SpringBusFactory();
URL busFile = Submission.class.getResource(WSSEC_XML);
File f = new File(busFile.getPath());
Bus bus = bf.createBus(busFile.toString());
BusFactory.setDefaultBus(bus);
BusFactory.setThreadDefaultBus(bus);
DefaultCryptoCoverageChecker coverageChecker = new DefaultCryptoCoverageChecker();
coverageChecker.setSignBody(true);
coverageChecker.setSignTimestamp(true);
coverageChecker.setEncryptBody(true);
coverageChecker.setSignAddressingHeaders(true);
MyClaimservice service = new MyClaimservice();
Myclaims port = service.getMyClaimsSoap11();
BindingProvider provider = (BindingProvider) port;
provider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, ENDPOINT_ADDRESS);
provider.getRequestContext().put(BindingProvider.SOAPACTION_URI_PROPERTY, SOAP_ACTION);
Client client = ClientProxy.getClient(port);
client.getOutInterceptors().add(new LoggingOutInterceptor());
client.getInInterceptors().add(new LoggingInInterceptor());
client.getInInterceptors().add(new WSS4JInInterceptor(getInProps())); …Run Code Online (Sandbox Code Playgroud) 我需要使用WS Security将我的.NET Framework 4客户端应用程序连接到部署在Apache CXF上的Web服务.那项服务不受我的控制.
该服务作为"服务引用"添加到项目中.
这是代理:
ServicePointManager.ServerCertificateValidationCallback = New System.Net.Security.RemoteCertificateValidationCallback(AddressOf AcceptAllCertifications)
Dim oBinding As New CustomBinding()
Dim oSecurity As SecurityBindingElement
oSecurity = AsymmetricSecurityBindingElement.CreateCertificateOverTransportBindingElement(MessageSecurityVersion.WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10)
oSecurity.IncludeTimestamp = True
oBinding.Elements.Add(oSecurity)
oBinding.Elements.Add(New CertFixEscapedComma.CertRefEncodingBindingElement())
( This a custom message encoder)
CertFixEscapedComma.CertRefEncoder.CERTIFICADO = Convert.ToBase64String(oCertificado.RawData)
oBinding.CloseTimeout = New TimeSpan(0, 2, 0)
Dim oTransport As New HttpsTransportBindingElement()
oBinding.Elements.Add(oTransport)
Dim oProxyClient As New NameServiceClient(oBinding, New System.ServiceModel.EndpointAddress(New Uri("https://url_service")))
Dim oCertificado As X509Certificate2
oCertificado = function_client_certificate() ' this get the proper cert
oProxyClient.ClientCredentials.ClientCertificate.Certificate = oCertificado
oProxyClient.name_function(params) 'call to the remote …Run Code Online (Sandbox Code Playgroud)