当前位置: 首页 > 知识库问答 >
问题:

如何在weblogic 12c上调用ws-security/wss4j CXF webclient

金理
2023-03-14

我不确定我是否对wssecurity有正确的理解,所以请按照我需要做的事情的顺序纠正我,我将尝试解释我的问题。

我试图从启用策略的wsdl实现jaxws客户端,策略如下:

   <wsp:Policy wsu:Id="AsymmetricX509TokensWithUntPolicy">
    <wsp:ExactlyOne>
        <wsp:All>
            <sp:SupportingTokens xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
                <wsp:Policy>
                    <sp:UsernameToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
                        <wsp:Policy>
                            <sp:WssUsernameToken10/>
                        </wsp:Policy>
                    </sp:UsernameToken>
                </wsp:Policy>
            </sp:SupportingTokens>
            <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:AlgorithmSuite>
                        <wsp:Policy>
                            <sp:Basic128/>
                        </wsp:Policy>
                    </sp:AlgorithmSuite>
                    <sp:Layout>
                        <wsp:Policy>
                            <sp:Lax/>
                        </wsp:Policy>
                    </sp:Layout>
                    <sp:IncludeTimestamp/>
                    <sp:ProtectTokens/>
                    <sp:OnlySignEntireHeadersAndBody/>
                </wsp:Policy>
            </sp:AsymmetricBinding>
            <sp:SignedParts>
                <sp:Body/>
                <sp:Header Name="Timestamp" Namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"/>
            </sp:SignedParts>
            <sp:Wss11>
                <wsp:Policy>
                    <sp:MustSupportRefKeyIdentifier/>
                </wsp:Policy>
            </sp:Wss11>
        </wsp:All>
    </wsp:ExactlyOne>
</wsp:Policy>

我成功地创建了一个独立的cxf客户端,与安全的Web服务通信,主要是因为cxf框架中存在这些依赖关系

    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-ws-security</artifactId>
        <version>3.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-ws-policy</artifactId>
        <version>3.2.1</version>
    </dependency>

它们具有自动提供标题的特性,并且在幕后做了很多我不理解的事情,但它是有效的。我的客户端设置为simpel:

        Map ctx = ((BindingProvider) webServicePortType).getRequestContext();

    ClassLoader loader = Thread.currentThread().getContextClassLoader();
    Properties props = new Properties();
    try (InputStream resourceStream = loader.getResourceAsStream(signaturePropertyFilePath)) {
        props.load(resourceStream);
    } catch (IOException e) {
        throw new RuntimeException(
                "IOException: Unresolvable signature property filepath: " + signaturePropertyFilePath, e);
    }
    props.forEach((k, v) -> {
        ctx.put(k.toString(), v);
    });
    ctx.put(SecurityConstants.CALLBACK_HANDLER, callBackHandler);

    ctx.put(SecurityConstants.SIGNATURE_PROPERTIES, signaturePropertyFilePath);

现在我的问题是,我已经看到它工作了,所以我很高兴地将我的客户端移动到运行在weblogic 12c上的网络应用html" target="_blank">程序,但是现在事情出了问题。cxf-rt-ws-策略的良好的自动特性现在消失了,我得到了没有头的肥皂请求,这会导致错误:

These policy alternatives can not be satisfied: 

{http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}UsernameToken:收到的令牌与令牌包含要求不匹配{http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}AsymmetricBinding:收到的时间戳与要求不匹配{http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}发起者托肯{http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}X509Token:收到的令牌与令牌包含要求不匹配{http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}包含时间戳{http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}保护代币{http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}仅限SignEntireHeaders和Body{http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}签名部分:{http://www.w3.org/2003/05/soap-envelope}未签名的机构

没有标题的结果。

幸运的是,在weblogic上运行cxf客户端通常没有任何问题,只要webservices没有安全要求。在我的独立工作客户端中没有spring或Spring Boot,也许cxf本身调用了spring,但我没有帮助。

在weblogic上运行时,来自cxf框架的“PolicyInterceptorProviderRegistryImpl”停止工作。我怀疑这与cxf总线扩展有关。在容器中运行时,txt的工作方式不同。抱歉,weblogic上的webapplication中没有Spring。但我的单机版在没有Spring的情况下运行良好。cxf框架上的任何人请帮助!:)

那么为什么它是独立工作的,而不是在容器中运行时。有人能帮忙吗?

提前感谢:)

共有1个答案

贺俊楚
2023-03-14

我设法找到了另一个解决办法。在我的单机版上运行的ws-security头的良好自动注入行为从未在weblogic 12上运行过。相反,我必须手动配置它,让weblogic使用不同的JAXBContextFactory实现,而不是它自己的moxy impl。尽管cxf声称与moxy兼容,但与moxy存在问题。

>

  • 类路径创建以下文件META-INF/services/javax。xml。绑定JAXBContext
  • 将文本“com.sun.xml.bind.v2.ContextFactory”添加到文件中
  • 创建签名属性文件:

    security.username=151413  
    security.password=NA   
    security.signature.username=sisprivatekey
    org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
    org.apache.ws.security.crypto.merlin.keystore.type=jks
    org.apache.ws.security.crypto.merlin.keystore.password=changeit
    org.apache.ws.security.crypto.merlin.keystore.private.password=changeit
    org.apache.ws.security.crypto.merlin.keystore.file=KeyStore.jks
    

    创建回调处理程序

        CallbackHandler cpc = new CallbackHandler() {
    
        @Override
        public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
    
            for (int i = 0; i < callbacks.length; i++) {
    
                WSPasswordCallback pc = (WSPasswordCallback) callbacks[i];
    
                if (pc.getUsage() == WSPasswordCallback.SIGNATURE
                        || pc.getUsage() == WSPasswordCallback.DECRYPT) {
    
    
                        pc.setPassword("changeit");
                } else {
                    pc.setPassword("NA");
                }
            }
        }
    
    };
    

    手动设置wss4j/ws-安全:

        Client client = ClientProxy.getClient(webServicePortType);
    
    Map<String, Object> outProps = new HashMap<String, Object>();
    
    outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN + " "
            + WSHandlerConstants.TIMESTAMP + " " + WSHandlerConstants.SIGNATURE);
    outProps.put(WSHandlerConstants.USER, user);
    outProps.put(WSHandlerConstants.PW_CALLBACK_REF, callBackHandler);
    outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
    outProps.put(WSHandlerConstants.SIG_PROP_FILE, signaturePropertyFilePath);
    outProps.put(WSHandlerConstants.SIG_KEY_ID, "DirectReference");
    outProps.put(WSHandlerConstants.SIGNATURE_PARTS,
            "{Element}{http://schemas.xmlsoap.org/soap/envelope/}Body;{Element}{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd}Timestamp");
    
    client.getOutInterceptors().add(new WSS4JStaxOutInterceptor(outProps));
    

    成交。

  •  类似资料:
    • 我想知道如何在WebSphere Liberty中启用WS-Security 我在Liberty个人资料的server.xml中创建了一个用户(soa_user)和用户组(soa_group)。下面提到的所有功能都已成功安装。 server.xml 我有两个模块,一个用于生成EAR(ABCServiceEAR)文件,另一个是SOAPService(ABCSOAPService) 在src \ ma

    • 问题内容: 如何在Apache-CXF上为Apache JAX-WS启用Spring Security?Web上的示例包括Jax-RS示例,但我不使用Jax- RS。我不想使用cxf的安全性。如何在我的代码中实现它? 问题答案: 两种可能的方式: 将BasicAuthenticationFilter或DigestAuthenticationFilter放在CXF Servlet的前面。 将WS-S

    • 问题内容: 我已经阅读了各种教程和论坛,但是还没有找到结合使用Spring安全性和struts2来研究编码的有效示例。当前的大多数示例都在XML文件中使用预定义的用户名和密码,但未连接到数据库。 如果您知道任何示例或教程,请告诉我。 问题答案: 您可能应该从以下教程开始: Spring Security第1部分–具有数据库的简单登录应用程序 Spring Security第2部分–密码加密,自定义

    • 我正在使用下面的命令检查12C中Weblogic服务器的状态,该命令在10.x Weblogic中正常工作 java weblogic.admin-URL t3:/$IP:$端口getstate-username$username-password$password 我将类路径设置如下导出classpath=$WL_HOME/server/lib/weblogic.jar

    • 我希望能够在cxf中每次发送soap消息时动态更改/设置ws-security信息。如何才能最好地做到这一点。 详细信息:我想更改密钥库名称、密钥库别名、密码、主机名等设置。。在运行时,最好是每次发送消息。目前我正在使用:jaxws-client和WSS4JOutInterceptor以及wss4jinterceptor进行签名。我正在使用http导管和tls客户端参数进行SSL/tls通信。ja

    • 问题内容: 我在站点的文档上有一些ajax调用,这些调用根据ajax状态显示或隐藏进度条 我想基本上在网站的其他部分覆盖这些方法,这些地方会进行许多快速的小型ajax调用,并且不需要弹出和弹出进度条。我试图将它们附加到其他$ .getJSON和$ .ajax调用中或将其插入。我已经尝试过将它们链接起来,但是显然那不好。 问题答案: 2018注意: 此答案已过时; 您可以随时对这个答案进行修改,以解