How to Provide a Custom Socket Factory to be used in SSL Communication
- Eran Chinthaka
- Software Engineer - WSO2
First we need to create an instance of org.apache.commons.httpclient.protocol.Protocol.
Protocol myProtocolHandler = new Protocol("https", new MySSLSocketFactory(), 443);
MySSLSocketFactory should implement org.apache.commons.httpclient.protocol.ProtocolSocketFactory interface, which provides a method to get a new socket from a host name and port.
Then this needs to be passed to AxisEngine, through the message context.
messageContext.getOptions().setProperty(HTTPConstants.CUSTOM_PROTOCOL_HANDLER, myProtocolHandler);
or via the Options in service client
serviceClient.getOptions().setProperty(HTTPConstants.CUSTOM_PROTOCOL_HANDLER, myProtocolHandler);
That's it. When you try to send a message using HTTPS, with the above configured message context, Axis2 will use the provided socket factory implementation.
You can provide a virtual protocol name to be used with your new socket factory as well. In order to do this, you just have to register your new protocol with HTTPClient. Nothing else is required to be passed in to Axis engine.
Protocol.registerProtocol("myhttps", new Protocol("https", new MySSLSocketFactory(), 9443));
This will enable you to use URLs like myhttps://www.myendpoint.com with SSL support. This won't change anything if you use HTTPS. If you want to change the behaviour of HTTPS for the whole system, then use https instead of myhttps.
Protocol.registerProtocol("https", new Protocol("https", new MySSLSocketFactory(), 9443));
Applies To
Apache Axis2/Java, post 1.2 versions and nightly builds
JDK 1.4 or later
More Information
Apache Jakarta Commons HTTPClient
The SSL Guide in Apache Commons HTTP Client - How to Provide a Custom Socket Factory to be used in SSL Communication only with HTTPClient