Re: Axis2 How to use my own HttpClient with SSL cert
robertlazarski <[email protected]> Thu, 4 Nov 2021 04:26:11 -1000
| Newsgroups | gmane.text.xml.axis.user |
|---|---|
| Message-ID | <CABpPLBVK0GxAZhSm89x_dMUXn6S6it+++GS-8W9dXnJZDc2u8w@mail.gmail.com> |
I don't see where the cert is loaded in your code.
BTW, the latest httpclient version is 4.5.13.
Anyways, if unsure you can find the cert of the target server via:
openssl s_client -connect myserver.com:443 <http://myarch.com:443>
-showcerts
Then you can set up httpclient like so ... tested with JSON, not SOAP but
the SSL init should be the same. And I am actually using HC5 legacy
packages in this example - hope this helps anyways as this should be close
to what you need.
Certificate certificate =
CertificateFactory.getInstance("X.509").generateCertificate(new
FileInputStream(new File("mycert.crt")));
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
keyStore.setCertificateEntry("server", certificate);
TrustManagerFactory trustManagerFactory = null;
trustManagerFactory =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
TrustManager[] trustManagers =
trustManagerFactory.getTrustManagers();
if (trustManagers.length != 1 || !(trustManagers[0] instanceof
X509TrustManager)) {
throw new Exception("Unexpected default trust managers:" +
Arrays.toString(trustManagers));
}
logger.warn("TrustManagerFactory init completed ...");
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, trustManagers, new SecureRandom());
SSLConnectionSocketFactory sslsf = new
SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
HttpClientConnectionManager cm =
PoolingHttpClientConnectionManagerBuilder.create()
.setSSLSocketFactory(sslsf)
.build();
final CloseableHttpClient httpclient =
HttpClients.custom().setConnectionManager(cm).build();
On Tue, Nov 2, 2021 at 4:16 AM Dorofeev Yury
<[email protected]> wrote:
> 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
>
> *[image: akm_logo]*
>
> It-avdelningen| It-utvecklingsenheten
>
> Box 5553 | 114 85 Stockholm
>
> Mob: 072 701 7632
>
> *www.aklagare.se <http://www.aklagare.se/>*
>
>
>
image001.png
(image/png, 3 KB) - not displayed