Hi! I've experiencing problem with sending Soap request from my client stub to server. The server requires SSL cert. Soap client stub was generated with wsdl2java from axis2 1.8.0 by using adb databinding. I've tested to send request with SoapUI program and it works fine which means that there is no problem with my SSL cert.
What is the best practices to rewrite axis2 httpclient to make it use my SSL cert? Do you have an example? Unfortunately I did not manage to find good example either on axis2 documentation or other java-comunities for axis2. Please help! Attaching my code and config here: Java Soap Client Stub: wsdl2java.bat -uri Navet\personpost_xml.wsdl -p se.skatteverket.navet.ws_stubV3 -o Navet\classes Axis2 1.8.0 httpclient-4.4.1.jar Java8 Min client java-code: CobCustomSSLSocketFactory socketFactory = new CobCustomSSLSocketFactory(null, null, "secret"); org.apache.http.impl.client.CloseableHttpClient lHttpClient = HttpClients.custom() .setSslcontext(socketFactory.getSSLContext()) .build(); String lAxisConfPath = CobServerEnv.getProperty("se.aklagare.axis2.property.path"); String lAxisConfFile = lAxisConfPath + "/" + CobServerEnv.getProperty("se.aklagare.axis2.property.file"); org.apache.axis2.context.ConfigurationContext ctx = ConfigurationContextFactory.createConfigurationContextFromFileSystem(lAxisConfPath, lAxisConfFile); ClientXMLStub lStub = new ClientXMLStub(ctx, mURL); lStub._getServiceClient().getOptions().setProperty(HTTPConstants.CACHED_HTTP_CLIENT, lHttpClient); public class CobCustomSSLSocketFactory extends SSLSocketFactory implements LayeredConnectionSocketFactory { private KeyStore mAmKeystore = null; private KeyStore mAmTruststore = null; private SSLContext mSSLContext = null; private String DEFAULT_ALGORITHM = "SunX509"; ... @Override public Socket createSocket(InetAddress pAddress, int pPort, InetAddress pInetAddress, int pLocalPort) throws IOException { return mSSLContext.getSocketFactory().createSocket(pAddress, pPort, pInetAddress, pLocalPort); } @Override public Socket createSocket(String pHost, int pPort, InetAddress pInetAddress, int pLocalPort) throws IOException { return mSSLContext.getSocketFactory().createSocket(pHost, pPort, pInetAddress, pLocalPort); } @Override public Socket createSocket(InetAddress pHost, int pPort) throws IOException { return mSSLContext.getSocketFactory().createSocket(pHost, pPort); } @Override public Socket createSocket(String pHost, int pPort) throws IOException { return mSSLContext.getSocketFactory().createSocket(pHost, pPort); } @Override public String[] getSupportedCipherSuites() { return mSSLContext.getSocketFactory().getSupportedCipherSuites(); } @Override public String[] getDefaultCipherSuites() { return mSSLContext.getSocketFactory().getDefaultCipherSuites(); } @Override public Socket createSocket(Socket pSocket, String pHost, int pPort, boolean pAutoClose) throws IOException { return mSSLContext.getSocketFactory().createSocket(pSocket, pHost, pPort, pAutoClose); } @Override public Socket createLayeredSocket(Socket pSocket, String pS, int pI, HttpContext pHttpContext) throws IOException, UnknownHostException { return mSSLContext.getSocketFactory().createSocket(pSocket, pS, pI, false); } @Override public Socket createSocket(HttpContext pHttpContext) throws IOException { return mSSLContext.getSocketFactory().createSocket(); } @Override public Socket connectSocket(int pI, Socket pSocket, HttpHost pHttpHost, InetSocketAddress pInetSocketAddress, InetSocketAddress pInetSocketAddress1, HttpContext pHttpContext) throws IOException { return mSSLContext.getSocketFactory().createSocket(); } } axis2.xml <axisconfig name="AxisJava2.0"> <!-- ================================================= --> <!-- Transport Outs --> <!-- ================================================= --> <parameter name="hotdeployment">true</parameter> <parameter name="hotupdate">false</parameter> <parameter name="enableMTOM">false</parameter> <parameter name="enableSwA">false</parameter> <transportSender name="local" class="org.apache.axis2.transport.local.LocalTransportSender"/> <transportSender name="http" class="org.apache.axis2.transport.http.impl.httpclient4.HTTPClient4TransportSender"> <parameter name="PROTOCOL">HTTP/1.1</parameter> <parameter name="Transfer-Encoding">chunked</parameter> <!-- If following is set to 'true', optional action part of the Content-Type will not be added to the SOAP 1.2 messages --> <!-- <parameter name="OmitSOAP12Action">true</parameter> --> </transportSender> <transportSender name="https" class="org.apache.axis2.transport.http.impl.httpclient4.HTTPClient4TransportSender"> <parameter name="PROTOCOL">HTTP/1.1</parameter> <parameter name="Transfer-Encoding">chunked</parameter> </transportSender> <!-- ================================================= --> <!-- Phases --> <!-- ================================================= --> <phaseOrder type="InFlow"> <!-- System predefined phases --> <phase name="Transport"> <handler name="RequestURIBasedDispatcher" class="org.apache.axis2.dispatchers.RequestURIBasedDispatcher"> <order phase="Transport"/> </handler> <handler name="SOAPActionBasedDispatcher" class="org.apache.axis2.dispatchers.SOAPActionBasedDispatcher"> <order phase="Transport"/> </handler> </phase> <phase name="Addressing"> <handler name="AddressingBasedDispatcher" class="org.apache.axis2.dispatchers.AddressingBasedDispatcher"> <order phase="Addressing"/> </handler> </phase> <phase name="Security"/> <phase name="PreDispatch"/> <phase name="Dispatch" class="org.apache.axis2.engine.DispatchPhase"> <handler name="RequestURIBasedDispatcher" class="org.apache.axis2.dispatchers.RequestURIBasedDispatcher"/> <handler name="SOAPActionBasedDispatcher" class="org.apache.axis2.dispatchers.SOAPActionBasedDispatcher"/> <handler name="RequestURIOperationDispatcher" class="org.apache.axis2.dispatchers.RequestURIOperationDispatcher"/> <handler name="SOAPMessageBodyBasedDispatcher" class="org.apache.axis2.dispatchers.SOAPMessageBodyBasedDispatcher"/> <handler name="HTTPLocationBasedDispatcher" class="org.apache.axis2.dispatchers.HTTPLocationBasedDispatcher"/> <handler name="GenericProviderDispatcher" class="org.apache.axis2.jaxws.dispatchers.GenericProviderDispatcher"/> <handler name="MustUnderstandValidationDispatcher" class="org.apache.axis2.jaxws.dispatchers.MustUnderstandValidationDispatcher"/> </phase> <phase name="RMPhase"/> <!-- System predefined phases --> <!-- After Postdispatch phase module author or service author can add any phase he want --> <phase name="OperationInPhase"> <handler name="MustUnderstandChecker" class="org.apache.axis2.jaxws.dispatchers.MustUnderstandChecker"> <order phase="OperationInPhase"/> </handler> </phase> <phase name="soapmonitorPhase"/> </phaseOrder> <phaseOrder type="OutFlow"> <!-- user can add his own phases to this area --> <phase name="soapmonitorPhase"/> <phase name="OperationOutPhase"/> <!--system predefined phase--> <!--these phase will run irrespective of the service--> <phase name="RMPhase"/> <phase name="PolicyDetermination"/> <phase name="MessageOut"/> <phase name="Security"/> </phaseOrder> <phaseOrder type="InFaultFlow"> <phase name="Addressing"> <handler name="AddressingBasedDispatcher" class="org.apache.axis2.dispatchers.AddressingBasedDispatcher"> <order phase="Addressing"/> </handler> </phase> <phase name="Security"/> <phase name="PreDispatch"/> <phase name="Dispatch" class="org.apache.axis2.engine.DispatchPhase"> <handler name="RequestURIBasedDispatcher" class="org.apache.axis2.dispatchers.RequestURIBasedDispatcher"/> <handler name="SOAPActionBasedDispatcher" class="org.apache.axis2.dispatchers.SOAPActionBasedDispatcher"/> <handler name="RequestURIOperationDispatcher" class="org.apache.axis2.dispatchers.RequestURIOperationDispatcher"/> <handler name="SOAPMessageBodyBasedDispatcher" class="org.apache.axis2.dispatchers.SOAPMessageBodyBasedDispatcher"/> <handler name="HTTPLocationBasedDispatcher" class="org.apache.axis2.dispatchers.HTTPLocationBasedDispatcher"/> <handler name="GenericProviderDispatcher" class="org.apache.axis2.jaxws.dispatchers.GenericProviderDispatcher"/> <handler name="MustUnderstandValidationDispatcher" class="org.apache.axis2.jaxws.dispatchers.MustUnderstandValidationDispatcher"/> </phase> <phase name="RMPhase"/> <!-- user can add his own phases to this area --> <phase name="OperationInFaultPhase"/> <phase name="soapmonitorPhase"/> </phaseOrder> <phaseOrder type="OutFaultFlow"> <!-- user can add his own phases to this area --> <phase name="soapmonitorPhase"/> <phase name="OperationOutFaultPhase"/> <phase name="RMPhase"/> <phase name="PolicyDetermination"/> <phase name="MessageOut"/> <phase name="Security"/> </phaseOrder> </axisconfig> Error when I send request Warning: no suitable certificate found - continuing without client authentication Regards Yury Dorofeev Cåbrakonsult [akm_logo] It-avdelningen| It-utvecklingsenheten Box 5553 | 114 85 Stockholm Mob: 072 701 7632 www.aklagare.se<http://www.aklagare.se/>