WSEncryptBody / WSSignEnvelope:未找到加密/签名的元素

时间:2017-01-25 11:38:34

标签: spring web-services soap cxf wss4j

我正在尝试连接到安全的soap Web服务,它使用x.509证书身份验证。我有.p12客户端密钥和.pfx服务器密钥。请找到以下配置和代码。

我得到的错误是 - 找不到加密/签名的元素:http://www.w3.org/2005/08/addressing,操作

我的POM;

<groupId>test-pps-2</groupId>
<artifactId>test-pps-2</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
    <cxf.version>2.6.0</cxf.version>
    <spring.version>3.2.4.RELEASE</spring.version>
    <wss4j.version>1.6.19</wss4j.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>${cxf.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>${cxf.version}</version>
    </dependency>
    <!-- Jetty is needed if you're are not using the CXFServlet -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http-jetty</artifactId>
        <version>${cxf.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-ws-security</artifactId>
        <version>${cxf.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.ws.security</groupId>
        <artifactId>wss4j</artifactId>
        <version>${wss4j.version}</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-codegen-plugin</artifactId>
            <version>${cxf.version}</version>
            <executions>
                <execution>
                    <id>generate-sources</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <sourceRoot>${project.build.directory}/generated/</sourceRoot>
                        <wsdlOptions>
                            <wsdlOption>
                                <wsdl>${basedir}/src/main/resources/WSDL.wsdl</wsdl>
                                <serviceName>PPS</serviceName>
                            </wsdlOption>
                        </wsdlOptions>
                    </configuration>
                    <goals>
                        <goal>wsdl2java</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

我的WSS4JOutInterceptor;

    <bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor" id="outbound-security">
    <constructor-arg>
        <map>
            <entry key="action" value="Signature Encrypt"/>
            <entry key="user" value="clientUser"/>
            <entry key="signatureUser" value="clientUser"/>
            <entry key="signaturePropFile" value="clientKeystore.properties"/>
            <entry key="useSingleCertificate" value="false"/>
            <entry key="encryptionPropFile" value="serviceKeystore.properties"/>
            <entry key="signatureKeyIdentifier" value="DirectReference"/>
            <entry key="encryptionUser" value="imsinterop"/>
            <entry key="encryptionKeyIdentifier" value="IssuerSerial"/>
            <entry key="passwordCallbackClass" value="pps.ClientPasswordCallback"/>
            <entry key="signatureParts" value="{Element}{http://schemas.xmlsoap.org/soap/envelope/}Body;
                        {Element}{http://www.w3.org/2005/08/addressing}Action;
                        {Element}{http://www.w3.org/2005/08/addressing}MessageID;
                        {Element}{http://www.w3.org/2005/08/addressing}To;"/>
            <entry key="encryptionParts" value="{Content}{http://schemas.xmlsoap.org/soap/envelope/}Body"/>
            <entry key="encryptionSymAlgorithm" value="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/>
            <entry key="encryptionKeyTransportAlgorithm" value=" http://www.w3.org/2001/04/xmlenc#rsa-1_5"/>
            <entry key="signatureAlgorithm" value="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
            <entry key="signatureCanonicalizationAlgorithm" value="http://www.w3.org/2001/10/xml-exc-c14n#"/>
        </map>
    </constructor-arg>
</bean>

当我尝试连接服务时,出现以下错误

org.apache.ws.security.WSSecurityException: General security error (WSEncryptBody/WSSignEnvelope: Element to encrypt/sign not found: http://www.w3.org/2005/08/addressing, Action)

我想如何纠正这个问题。谢谢。

1 个答案:

答案 0 :(得分:1)

看起来你需要启用WS-Addressing,因为找不到要签名的标题:http://cxf.apache.org/docs/ws-addressing.html