标签: ws-security

Ruby和WS-Security

我很难找到实现WS-Security的优秀Ruby库.我已经看过wss4r但尚未使用它(文档对它有点亮).您使用哪些库来完成此任务,或者有更好的替代方案?

ruby ws-security soap

5
推荐指数
1
解决办法
1758
查看次数

使用Java调用安全的Web服务

我需要编写一个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 &lt;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文件中定义的安全要求(如果我错了,请纠正我).

java security ws-security soap web-services

5
推荐指数
1
解决办法
3828
查看次数

WS安全性涉及的概念?

任何人都可以简要解释一下WS安全性所涉及的概念,以保护肥皂免受中间网络服

security websphere soa ws-security web-services

5
推荐指数
2
解决办法
644
查看次数

Axis2 + Rampart WebService签名和加密

我有一个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)

policy ws-security axis2 web-services

5
推荐指数
1
解决办法
5072
查看次数

在内部专用网络上保护 SOAP Web 服务的最佳方法是什么

今天,有越来越多的 Web 服务被开发供内部使用以将应用程序连接在一起。我们没有 ESB 来控制和保护这个 Web 服务,所以我想什么是保护它们的好方法。

我们尝试设置双向 SSL,但我们无法控制特定 Web 服务的授权。

我的需要是能够控制哪个应用程序正在调用我的 Web 服务,以及该应用程序是否有权调用它。

我不喜欢 WS-Trust 和 Ws-Security,因为这会改变原始 SOAP 消息,但似乎它们不是其他解决方案。

任何的想法?

谢谢

java ws-security web-services jax-ws

5
推荐指数
1
解决办法
2107
查看次数

Web 服务 - 用户名令牌 - 根据安全策略验证消息时出错 错误代码:1000

我正在尝试调用在 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)

有人能告诉我我做错了什么吗?

谢谢你。

java ws-security web-services jax-ws

5
推荐指数
1
解决办法
1万
查看次数

SOAP 1.2 over SSL + HTTP基本身份验证还是WS-Security?

所以我将是第一个承认我对WS-Security内部知之甚少的人.我有一个SOAP服务工厂,如下所示.将此服务与内部仅测试.NET客户端一起使用时(通过svcutil.exe +自动生成的WSDL使用自动生成的.cs代理类)一切正常.我可以在第5个"实际"(加密)SOAP请求/响应之前看到前4个安全SOAP请求 - 响应握手对.我一般都了解安全性,但希望我知道有关此特定握手的详细信息 - 我猜他们正在进行密钥交换?

无论如何,部分是因为

  1. 我不知道底层的SOAP安全握手(WS-Security)
  2. 我知道HTTPS和HTTP基本身份验证(并且更喜欢SSL传输的速度与每个消息SOAP加密/签名验证操作的速度)
  3. 我想保护SOAP端点通信,同时保留与非.NET客户端的兼容性

我以为我应该通过HTTPS + HTTP基本身份验证进行SOAP交换.所以问题归结为

  1. 是通过HTTPS + HTTP基本身份验证进行SOAP交换吗?或者罕见的(=互操作噩梦!)憎恶?
  2. 上面的跟进:如何将服务工厂配置为推荐设置?毋庸置疑,我希望远离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)

https ws-security soap

5
推荐指数
1
解决办法
3839
查看次数

WS-Security中PasswordDigest的工作算法

我遇到了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)

c# xml ws-security sha1 soapui

5
推荐指数
1
解决办法
4985
查看次数

如何在SOAPEnvelope中添加名称空间声明

在我的肥皂应用程序中,我正在使用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)

java ws-security soap web-services cxf

5
推荐指数
1
解决办法
8440
查看次数

来自.NET客户端的Apache CXF WS安全WebService - 无法解析用于解包密钥的KeyInfo

我需要使用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)

c# vb.net wcf ws-security soap

5
推荐指数
1
解决办法
310
查看次数

标签 统计

ws-security ×10

web-services ×6

soap ×5

java ×4

c# ×2

jax-ws ×2

security ×2

axis2 ×1

cxf ×1

https ×1

policy ×1

ruby ×1

sha1 ×1

soa ×1

soapui ×1

vb.net ×1

wcf ×1

websphere ×1

xml ×1