Apache CXF отключить WS-Security (TrustStore) для стороннего клиента - PullRequest
0 голосов
/ 15 января 2020

Я настроил конечную точку в CXF. xml следующим образом:

<jaxws:endpoint id="authentication"
    implementor="#authenticationService" address="/AuthenticationService">
    <jaxws:binding>
        <soap:soapBinding version="1.2" mtomEnabled="true" />
    </jaxws:binding>


    <jaxws:outInterceptors>
        <ref bean="TimestampSignEncrypt_Response"/>
    </jaxws:outInterceptors>
    <jaxws:inInterceptors>
        <ref bean="TimestampSignEncrypt_Request"/>
        <bean class="org.apache.cxf.ws.security.wss4j.CryptoCoverageChecker"/>
    </jaxws:inInterceptors>
    <jaxws:properties>
        <entry key="ws-security.is-bsp-compliant" value="false"/>
    </jaxws:properties>
</jaxws:endpoint>

jaxws: inInceptceptors - org. apache. cxf.ws.security.wss4j.WSS4JInInterceptor - TimestampSignEncrypt_Request:

<bean
    id="TimestampSignEncrypt_Request"
    class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
    <constructor-arg>
        <map>
            <entry key="action" value="Timestamp Signature Encrypt"/>
            <entry key="signaturePropFile" value="/WEB-INF/resources/authenticationServiceTrustStore.properties"/>
            <entry key="decryptionPropFile" value="/WEB-INF/resources/authenticationServiceTrustStore.properties"/>
            <entry key="passwordCallbackRef">
                <ref bean="ServiceTrustStorePasswordCallback" />
            </entry>
            <entry key="encryptionKeyTransportAlgorithm" value="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"/>
            <entry key="signatureAlgorithm" value="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
        </map>
    </constructor-arg>
</bean>

jaxws: outInterceptors - org. apache .cxf.ws.security.wss4 .WSS4JOutInterceptor - TimestampSignEncrypt_Response:

<bean
    id="TimestampSignEncrypt_Response"
    class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor"
    >
    <constructor-arg>
        <map>
            <entry key="action" value="Timestamp Signature Encrypt"/>
            <entry key="user" value="@trustStoreAuthAlias@"/>
            <entry key="signaturePropFile" value="/WEB-INF/resources/authenticationServiceTrustStore.properties"/>
            <entry key="encryptionPropFile" value="/WEB-INF/resources/authenticationServiceTrustStore.properties"/>
            <entry key="encryptionUser" value="useReqSigCert"/>
            <entry key="passwordCallbackRef">
                <ref bean="ServiceTrustStorePasswordCallback" />
            </entry>
            <entry key="signatureParts" value="{Element}{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd}Timestamp;{Element}{http://www.w3.org/2003/05/soap-envelope}Body"/>
            <entry key="encryptionParts" value="{Element}{http://www.w3.org/2000/09/xmldsig#}Signature;{Content}{http://www.w3.org/2003/05/soap-envelope}Body"/>
            <entry key="encryptionSymAlgorithm" value="http://www.w3.org/2001/04/xmlenc#tripledes-cbc"/>
            <entry key="encryptionKeyTransportAlgorithm" value="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"/>
            <entry key="signatureAlgorithm" value="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
        </map>
    </constructor-arg>
</bean>

Моя задача состояла в том, чтобы добавить взаимную аутентификацию SSL. Поэтому я создал TrustStore для сервера и еще один для клиента, и когда я вызываю свой сервис (AuthenticationService) с SOAPUI, все работает, как и ожидалось. К существующей логике c службы мне пришлось добавить вызов во внешнюю службу, которая не обеспечивает никакой безопасности. Это конфигурация клиента в cxf. xml:

<bean id="externalServiceClient" factory-bean="externalServiceClientFactory"
      factory-method="create" />

<bean id="externalServiceClientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
    <property name="serviceClass"
              value="com.example.external.client.ExternalServiceClient" />
    <property name="bindingId"
              value="http://www.w3.org/2003/05/soap/bindings/HTTP/" />
    <property name="outInterceptors">
        <list>
            <ref bean="saajOut" />
        </list>
    </property>
</bean>

<bean id="saajOut"
    class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor" />

Когда я пытаюсь вызвать эту внешнюю службу во время выполнения после вызова AuthenticationService я получаю следующую ошибку:

Caused by: javax.net.ssl.SSLException: java.security.ProviderException: Could not derive key
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:208) [jsse.jar:1.8.0_121]
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949) [jsse.jar:1.8.0_121]
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1906) [jsse.jar:1.8.0_121]
    at sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1889) [jsse.jar:1.8.0_121]
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1410) [jsse.jar:1.8.0_121]
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) [jsse.jar:1.8.0_121]
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559) [rt.jar:1.8.0_121]
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) [rt.jar:1.8.0_121]
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1316) [rt.jar:1.8.0_121]
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1291) [rt.jar:1.8.0_121]
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250) [rt.jar:1.8.0_121]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1367) [cxf-2.4.6.jar:2.4.6]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1309) [cxf-2.4.6.jar:2.4.6]
    at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:42) [cxf-2.4.6.jar:2.4.6]
    at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69) [cxf-2.4.6.jar:2.4.6]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1387) [cxf-2.4.6.jar:2.4.6]
    ... 63 more
Caused by: java.security.ProviderException: Could not derive key
    at sun.security.ec.ECDHKeyAgreement.engineGenerateSecret(ECDHKeyAgreement.java:133)
    at sun.security.ec.ECDHKeyAgreement.engineGenerateSecret(ECDHKeyAgreement.java:163)
    at javax.crypto.KeyAgreement.generateSecret(KeyAgreement.java:648) [jce.jar:1.8.0_121]
    at sun.security.ssl.ECDHCrypt.getAgreedSecret(ECDHCrypt.java:102) [jsse.jar:1.8.0_121]
    at sun.security.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:1061) [jsse.jar:1.8.0_121]
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:348) [jsse.jar:1.8.0_121]
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1026) [jsse.jar:1.8.0_121]
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:961) [jsse.jar:1.8.0_121]
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062) [jsse.jar:1.8.0_121]
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) [jsse.jar:1.8.0_121]
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) [jsse.jar:1.8.0_121]
    ... 74 more
Caused by: java.security.InvalidAlgorithmParameterException
    at sun.security.ec.ECDHKeyAgreement.deriveKey(Native Method)
    at sun.security.ec.ECDHKeyAgreement.engineGenerateSecret(ECDHKeyAgreement.java:130)
    ... 84 more

Почему он пытается использовать SSL, хотя я не настроил никакой тип безопасности для клиента?

Сначала я думал, что это из-за jaxws: outInterceptors , настроенного для конечной точки, поэтому я попытался удалить его, но ничего не изменилось. Я также проверил на внешнем сервере, проходил ли мой вызов, но он даже не получил его. Если я полностью удаляю свою конфигурацию безопасности из конечной точки, AuthenticationService может вызывать внешнюю службу с помощью без проблем.

Как я могу исключить защиту, пока AuthenticationService вызывает внешнюю службу?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...