标签: ws-security

用于 Web 服务的 WCF 客户端,具有 WS-Security、签名标头、身份验证令牌和正文加密

我被分配为 Web 服务创建一个客户端。我以前没有使用 Web 服务的经验,并且一直在尝试但没有成功。\nWeb 服务托管在https://ws.conf.ebs.health.gov.on.ca:1441/EDTService/EDTService \n我是能够使用 Visual Studio 2012 创建代理类并创建被服务拒绝的基本客户端,因为它不包含服务所需的任何安全规范。\n以下内容摘自文档,可从 http获取://www.health.gov.on.ca/en/pro/publications/ohip/default.aspx

\n\n

WS-Security 部分包括:\nWSS 1.1 的技术规范\n\xe2\x80\xa2 身份要求;\n\xe2\x80\xa2 签名要求;\n\xe2\x80\xa2 加密要求;和\n\xe2\x80\xa2 时间戳

\n\n

IDP\n为了确保消息中敏感信息的机密性和完整性,发送方软件必须使用公钥技术对 SOAP 标头和正文进行签名。\n签名证书可以是任何可用的证书,并且可以进行自签名。\n如果有任何响应数据如果指定要加密,则根据特定的 Web 服务技术规范,将至少使用 AES128-CBC 对称加密算法以及属于初始 SOAP 请求签名者的公钥对数据进行加密。可以根据具体的Web服务技术规范增加加密算法。

\n\n

我的目标是创建一个可以访问此服务的 wcf 客户端。到目前为止,这就是我所做的,但它不起作用:\n此示例尝试将文件上传到服务器:

\n\n
        EndpointAddress address = new EndpointAddress("https://ws.conf.ebs.health.gov.on.ca:1441/EDTService/EDTService");\n        //MCEDT userID and password\n        string userId = "abcdefg";\n        string password = "password";\n        //MOH Id\n        string mohId = "123456";\n        //Vendor Conformance Key\n        string key = "1234abcd-eeee-aaaa-ffff-abcdef123456";\n\npublic void upload()\n        {\n            Console.WriteLine("Uploading....");\n            //Specify the binding to be used for the …
Run Code Online (Sandbox Code Playgroud)

c# wcf ws-security client soap

2
推荐指数
1
解决办法
7584
查看次数

将 UsernameToken (WS-Security-Header) 添加到 SOAP 消息

我正在尝试连接到现有的 SOAP Web 服务。我提供了一个 wsdl,从中我通过 Apache Axis2 XMLBeans 创建了 Java 类。

但是现在我必须使用 WS-Security-Header 扩展我自己编写的客户端发送的消息。我怎样才能做到这一点?

我为此找到了 Apache Rampart 项目,但找不到任何解决方案来扩展从我的 Java 类创建的消息,并使用此类标头。我只能找到为服务建立 WS 安全性的机会(在 webapp 文件夹等中)。

我对你的回答感到兴奋!

感谢您的帮助!

java ws-security soap axis2 rampart

2
推荐指数
1
解决办法
6707
查看次数

org.apache.cxf.ws.policy.PolicyException:无法满足任何策略选择

我想用 JUnit 和 Apache CXF 编写一个简单的集成测试来测试一些支持 WS-Security 的服务。当我尝试运行我的代码时:

MyService myService = new myWsService(MY_SERVICE_WSDL).getMyWs()
Client client = ClientProxy.getClient(myService);
Map<String, Object> ctx = ((BindingProvider) myService).getRequestContext();
ctx.put("ws-security.callback-handler", new KeystorePasswordCallback());
ctx.put("ws-security.signature.crypto", new MyMerlinImpl());
Run Code Online (Sandbox Code Playgroud)

MyMerlinImpl 只是在重写loadProperties方法中传递所需的 Merln.* 属性值,

我得到:

sie 12, 2015 11:52:10 AM org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl handleNoRegisteredBuilder
WARNING: No assertion builder for type {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}AsymmetricBinding registered.
sie 12, 2015 11:52:10 AM org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl handleNoRegisteredBuilder
WARNING: No assertion builder for type {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}InitiatorToken registered.
sie 12, 2015 11:52:10 AM org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl handleNoRegisteredBuilder
WARNING: No assertion builder for type {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}X509Token …
Run Code Online (Sandbox Code Playgroud)

java ws-security integration-testing web-services cxf

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

来自Java的soap中的UserNameToken

我正在尝试使用来自Netbeans的gSoap生成的wsdl.Web服务要求传入UserNameToken.当我使用SoapUI中的wsdl(有效)时,它发送:

<wsse:Username>myname</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">mypass</wsse:Password>
Run Code Online (Sandbox Code Playgroud)

但是,当我使用处理程序(如何使用Java JAX-WS添加SOAP Header)从Netbeans尝试它时,如下所示:

            String prefix = "wsse";
            String uri = "http://...wsssecurity...";

            SOAPElement securityElem = factory.createElement("Security",prefix,uri);

                SOAPElement UserNametokenElem = factory.createElement("UserNameToken",prefix,uri);

                    SOAPElement UsernameElem = factory.createElement("wsse:Username");
                    UsernameElem.addTextNode("myname");
                    SOAPElement PasswordElem = factory.createElement("Password");
                    PasswordElem.addTextNode("mypass");

                    UserNametokenElem.addChildElement(UsernameElem);
                    UserNametokenElem.addChildElement(PasswordElem);

                    securityElem.addChildElement(UserNametokenElem);
            SOAPHeader header = envelope.addHeader();
            header.addChildElement(securityElem);
Run Code Online (Sandbox Code Playgroud)

它会像这样生成soap标头:

    <wsse:Security xmlns:wsse="http://...wsssecurity...">
    <wsse:UserNameToken xmlns:wsse="http://...wsssecurity...">
    <Username xmlns="">myname</Username>
    <Password xmlns="">mypass</Password>
    </wsse:UserNameToken>
    </wsse:Security>
Run Code Online (Sandbox Code Playgroud)

这会导致Web服务回复身份验证错误.

因此,我的问题是:

  1. 如何以正确的方式生成UserNameToken(如SoapUi所做的那样)?
  2. 使用处理程序或Apache WSS4J之类的外部WSSE库(可以有人向我展示一些示例代码)是否更好?

java xml ws-security soap usernametoken

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

在Java中为ws-security UsernameToken实现密码摘要

我试图从服务器调用一个ws-security安全的Web服务,遗憾的是它本身不支持这个.我采用的方法是实现一个.jsp,它充当实际端点URL的反向代理,在这个过程中添加了带有ws-security元素的元素.

这似乎工作得很好,我相信我已经使用正确的命名空间等正确构造了XML.我已经通过比较XML与SOAP-UI生成的XML来验证这一点.

问题在于实现密码摘要生成器.我没有得到与使用相同的NOnce,xsd:dateTime和密码输入以及以下代码的SOAP-UI相同的结果.

StringBuffer passwordDigestStr_ = new StringBuffer();

// First append the NOnce from the SOAP header
passwordDigestStr_.append(Base64.decode("PzlbwtWRpmFWjG0JRIRn7A=="));

// Then append the xsd:dateTime in UTC timezone
passwordDigestStr_.append("2012-06-09T18:41:03.640Z");

// Finally append the password/secret
passwordDigestStr_.append("password");

System.out.println("Generated password digest: " + new String(com.bea.xbean.util.Base64.encode(org.apache.commons.codec.digest.DigestUtils.sha(passwordDigestStr_.toString())), "UTF-8"));
Run Code Online (Sandbox Code Playgroud)

我认为问题在于实现前两个元素的散列,如http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0.pdf所述.

注意,使用其解码值的八位位组序列对随机数进行散列,而时间戳使用其元素内容中指定的UTF8编码的八位位组序列进行散列.

如果有人能帮助我解决这个问题,那会很好,因为它开始让我发疯!如果您能提供源代码,那将是理想的选择.

java ws-security soap usernametoken

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

CXF WSS4J拦截器

我正在尝试使用以下代码配置WSS4J拦截器:

        try {

        Map<String, Object> outProps = new HashMap<String, Object>();

        outProps.put(WSHandlerConstants.ACTION,
                WSHandlerConstants.TIMESTAMP + " "
                        + WSHandlerConstants.SIGNATURE + " "
                        + WSHandlerConstants.ENCRYPT);
        outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
        outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS,
                ClientKeystorePasswordCallback.class.getName());
        outProps.put(WSHandlerConstants.SIG_PROP_FILE,
                "clientWSsec-PC165.properties");
        outProps.put(WSHandlerConstants.ENC_PROP_FILE,
                "clientWSsec-PC165-Srv.properties");
        outProps.put(WSHandlerConstants.SIGNATURE_USER, "clientKey");
        outProps.put(WSHandlerConstants.ENCRYPTION_USER, "serverKey");

        Map<String, Object> inProps = new HashMap<String, Object>();

        inProps.put("action", "Timestamp Signature Encrypt");
        inProps.put("passwordType", "PasswordText");
        inProps.put("passwordCallbackClass",
                "utils.ClientKeystorePasswordCallback");
        inProps.put("signatureUser", "clientKey");
        inProps.put("encryptionUser", "serverKey");
        inProps.put("encryptionPropFile", "clientWSsec-PC165.properties");
        inProps.put("signaturePropFile", "clientWSsec-PC165.properties");


        DefaultCryptoCoverageChecker coverageChecker = new DefaultCryptoCoverageChecker();
        coverageChecker.setSignBody(true);
        coverageChecker.setSignTimestamp(true);
        coverageChecker.setEncryptBody(true);

        Service service = new Service ();
        WsService  wsService = service.getWsServiceSOAP();

        org.apache.cxf.endpoint.Client client = ClientProxy
                .getClient(wsService); …
Run Code Online (Sandbox Code Playgroud)

ws-security cxf interceptor wss4j

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

WIF STS身份验证后,恢复正常Http

我有一个MVC3网络应用程序,可以自定义StarterSTS的自定义.我要求知道领域和身份验证要求SSL.

它很有效.

问题是当用户回到我们使用https浏览的网站时.这不是我想要的经验.我的网站不是银行或类似的东西.我认为认证对话应该是安全的(我认为)和令牌加密(我敢肯定).但是,如果我在验证后手动将网址从https更改为http,则表示我未获得授权.

1)为什么?

2)是否可以回归http?或者......我是否应该要求https进行身份验证,但保留令牌加密?

ws-security wif

0
推荐指数
1
解决办法
278
查看次数

使用WCF将WS-Security凭据添加到SOAP标头

我正在尝试与我无法控制的Java Web服务进行通信,并且我正在尝试创建一个可以正常工作的绑定.

  1. 标头中不允许使用时间戳,因此为了使用该includeTimestamp="false"属性,我必须使用a <customBinding>.
  2. 他们正在使用MTOM,所以我必须使用该<mtomMessagingEncoding>元素.

这是我的<bindings>元素:

<bindings>
  <customBinding >
    <binding name="MyBindingName" >
      <mtomMessageEncoding  />
      <transactionFlow />
      <security authenticationMode="UserNameOverTransport"
                includeTimestamp="false">            
      </security>
    </binding>
  </customBinding>
</bindings>
Run Code Online (Sandbox Code Playgroud)

SOAP Web服务要求邮件头采用以下格式:

 <soap:Envelope ... >
  <soap:Header ... >
    <wsse:UsernameToken>
      <wsse:Username>doo</wsse:Username>
      <wsse:Password Type="wsse:PasswordText">fuss</wsse:Password>
    </...>
  </...>
 </...>
Run Code Online (Sandbox Code Playgroud)

我最接近的是:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" 
            xmlns:a="http://www.w3.org/2005/08/addressing" 
            xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
  <s:Header>
    <a:Action s:mustUnderstand="1"></a:Action>
    <a:MessageID>urn:uuid:a368e205-a14d-4955-bf75-049cdd3a78c0</a:MessageID>
    <a:ReplyTo>
      <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
    </a:ReplyTo>
    <a:To s:mustUnderstand="1">https://blablabla</a:To>
    <o:Security s:mustUnderstand="1" 
                xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <o:UsernameToken u:Id="uuid-0f1e399b-31a8-4e00-a57f-277c21e94879-1">
      <o:Username><!-- Removed--></o:Username>
      <o:Password><!-- Removed--></o:Password>
    </o:UsernameToken>
   </o:Security>
 </s:Header>
Run Code Online (Sandbox Code Playgroud)

我相信我在这里错过了一些琐碎和愚蠢的东西,但对于我的生活,我无法弄清楚它可能是什么.

wcf ws-security soap soap-client wsse

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

如何在PHP上设置SOAP标头以验证Web服务?

我需要将SOAP标头设置为以下格式:

<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">
        <wsse:UsernameToken wsu:Id="UsernameToken-45">
            <wsse:Username>XXXXX</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">XXXXXXX</wsse:Password>
            <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">OxWtCYYj1cX7HiZeMEqorw==</wsse:Nonce>
            <wsu:Created>2013-09-18T07:25:50.227Z</wsu:Created>
        </wsse:UsernameToken>
    </wsse:Security>
</soapenv:Header>
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用下面的代码验证Web服务,但它不起作用.

$momurl = "https://integrationdev.momentum.co.za/sales/CRMService/CRMLeadService_v1_0/";

$client = new SoapClient(
    "$momurl",
    array(
        'trace' => 1,
        'login' => $username,
        'password' => $password
    )
);
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.提前致谢.

php ws-security soap wsdl web-services

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

如何在 CXF 中的 ContainerRequestFilter 中注入 ResourceInfo

我正在尝试使用 Apache CXF 和 Spring 构建基于令牌的身份验证和授权系统。我完全按照这个很棒的帖子来做这件事。但是我一开始就遇到了 AuthorizationFilter 的问题。我看过很多关于它的帖子,apache JIRA,github 评论,但还没有找到解决这个看似 CXF 问题的方法。

@PreMatching
@Priority(Priorities.AUTHORIZATION)
public class AuthorizationFilter implements ContainerRequestFilter {
private ResourceInfo resourceInfo;

@Context
public void setResourceInfo(ResourceInfo resourceInfo) {
    this.resourceInfo = resourceInfo;
}

@Override
public void filter(final ContainerRequestContext requestContext) throws IOException {

    Method method = resourceInfo.getResourceMethod();
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,注入的 resourceInfo 是一个代理对象,它没有任何关联的属性存在。因此,来自该resourceInfo对象的任何内容都将返回null,更具体地说resourceInfo.getResourceMethod()null,导致 NPE。这是关于这个问题的JIRA帖子,说:

在某些情况下(例如使用 @ApplicationScoped 注释),CDI 运行时将为特定 bean 创建代理类。结果,CXF 端将把特定的提供者元数据绑定到这个代理实例。它看起来合乎逻辑且毫不含糊。

然而,当 CXF 尝试将上下文代理(@Context 注释)注入提供程序实例时,有趣的事情正在发生。注入成功,但它们的目标对象将是代理实例(而不是其背后的真实实例)。因此,在运行时,当代理将调用委托给支持实例时,所有上下文代理在那里都是空的(简单地说,没有设置)。

参考最近与 Sergey Beryozkin 的讨论,最好的解决方案是将 @Context …

rest ws-security spring cxf jax-rs

0
推荐指数
1
解决办法
854
查看次数