========
Problem: " server certificate change is restricted during renegotiation"
======== 
javax.xml.ws.soap.SOAPFaultException: Marshalling Error: server certificate 
change is restricted during renegotiation -- Unable to make connection to ECPR 
getCustomerInformation201205 WebService -- stack trace=
com.wellsfargo.launchpad.exceptions.SystemException
                at 
com.wellsfargo.ebs.framework.fault.SystemFaultHelper.getFault(SystemFaultHelper.java:40)
                at 
com.wellsfargo.ebs.rewards.account.dao.EcprDAOImpl.getCustomerInformation(EcprDAOImpl.java:102)
                at 
com.wellsfargo.ebs.rewards.inquiry.GetRewardsDetailsWorkingModel.updateRewardsAccountInfoWithDetailsFromECPR(GetRewardsDetailsWorkingModel.java:644)
                at 
com.wellsfargo.ebs.rewards.inquiry.GetRewardsDetailsService.executePOIRequest(GetRewardsDetailsService.java:227)
                at 
com.wellsfargo.ebs.rewards.inquiry.GetRewardsDetailsService.getRewardsDetails(GetRewardsDetailsService.java:121)
                at 
com.wellsfargo.ebs.rewards.inquiry.GetRewardsDetailsService.getRewardsDetails201311(GetRewardsDetailsService.java:92)
                at 
com.wellsfargo.service.provider.ebs.rewards201311.EBSRewardsPortTypeImpl.getRewardsDetails(EBSRewardsPortTypeImpl.java:49)
                at sun.reflect.GeneratedMethodAccessor133.invoke(Unknown Source)
                at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                at java.lang.reflect.Method.invoke(Method.java:483)
                at 
org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:180)
                at 
org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
                at 
org.apache.cxf.jaxws.AbstractJAXWSMethodInvoker.invoke(AbstractJAXWSMethodInvoker.java:178)
                at 
com.wellsfargo.ebs.framework.cxf.ServiceWorxJAXWSMethodInvoker.invoke(ServiceWorxJAXWSMethodInvoker.java:114)
                at 
org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:75)
                at 
org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:57)
                at 
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
                at java.util.concurrent.FutureTask.run(FutureTask.java:266)
                at 
org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37)
                at 
org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:106)
                at 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
                at 
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
                at 
org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)
                at 
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248)
                at 
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222)
                at 
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153)
                at 
org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:167)
                at 
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286)
                at 
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:206)
.......................

=========
The Cause:
========= 
Java recently fixed a Triple Handshake Attack problem. 
https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2014-6457
by checking EndpointIdentificationAlgorithm (see sun.security.ssl. 
ClientHandshaker.java (Java 7u72 or after)
Here is the change. 
.............
     if (this.reservedServerCerts != null)
     {
       localObject = getEndpointIdentificationAlgorithmSE();
       if ((  (localObject == null) || (((String)localObject).length() == 0)  ) 
&& (!isIdentityEquivalent(arrayOfX509Certificate[0], 
this.reservedServerCerts[0])))
       {
         fatalSE(42, "server certificate change is restrictedduring 
renegotiation");
       }
     }
...............

As you see, if EndpointIdentificationAlgorithm of SSL socket does not set, it 
will throw "server certificate change is restrictedduring renegotiation" error 
at some condition (e.g. Server uses multiple SSL certificates).
 
Sun HttpsURLConnection set EndpointIdentificationAlgorithm = "HTTPS" if you do 
not use Custom Hostname Verifier.  
See Case 2. 
http://www.docjar.net/html/api/sun/net/www/protocol/https/HttpsClient.java.html.
  Using HttpsURLConnection with default Hostname Verifier will not have this 
error because of EndpointIdentificationAlgorithm = "HTTPS".  (note: This is 
also proved by testing)

Sun HttpsURLConnection used by Apache CXF Http Transport uses Custom Hostname 
Verifier. As a result, EndpointIdentificationAlgorithm = null. See Case 4. 
http://www.docjar.net/html/api/sun/net/www/protocol/https/HttpsClient.java.html,
 which caused " server certificate change is restricted during renegotiation" 
exception.

Note: "server certificate change is restricted during renegotiation" error only 
happens while SSL Clients  are accessing URL which uses multiple SSL 
certificates due to load balance (e.g.  F5). This is a complicated SSL topic 
and we do not need to discuss root cause and its solutions  because there are 
many options. 

========
Question:
========
As we know, setting EndpointIdentificationAlgorithm="HTTPS" is one of 
solutions. (perfect solution requires doing Endpoint Identification work at TLS 
layer).
 
Besides using custom SSL Factory to set SSL Socket 
EndpointIdentificationAlgorithm,  is there an easy way (or tip) to Set SSL 
Socket EndpointIdentificationAlgorithm to be "HTTPS" in Apache CXF HTTP 
Transport

Thanks in advance

Ed

Reply via email to