Я настроил конечную точку в 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 вызывает внешнюю службу?
Спасибо