You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Weihua JIANG <we...@gmail.com> on 2010/10/21 10:31:49 UTC

How to use custom SSLServerSocketFactory to publish endpoints?

Hi all,

I want to use Not-Yet-Commons-SSL to handle SSL certificates. So, I
prefer to use its SSLServerSocketFactory implementation for CXF
endpoint publish. However, I can't find any document or sample on how
to write code.

Can anyone help me on this?


Thanks
Weihua

Re: How to use custom SSLServerSocketFactory to publish endpoints?

Posted by Weihua JIANG <we...@gmail.com>.
Finally get it to work. Code fragment is:

MySSLSocketConnector connector = new MySSLSocketConnector();
connector.setPort(8082); //The code I missed in first version
JettyHTTPServerEngine engine = f.createJettyHTTPServerEngine(8082, "http");
//reconfigure this engine to use https instead of http
engine.setTlsServerParameters(new TLSServerParameters());
engine.setConnector(connector);

Thanks
Weihua

2010/10/25 Weihua JIANG <we...@gmail.com>:
> Hi Daniel,
>
> I tried your solution, but failed. It seems the server is not created
> at all. I can't connect to it either by browser or by wget.
>
> Below is my code:
> public class MySSLSocketConnector extends
> org.eclipse.jetty.server.ssl.SslSocketConnector {
>
>        @Override
>        protected SSLServerSocketFactory createFactory() throws Exception {
>                SSLServer server = new SSLServer();
>
>                String pathToKeyMaterial = "certs/server.jks";
>                char[] password = "123456".toCharArray();
>                KeyMaterial km = new KeyMaterial( pathToKeyMaterial, password );
>
>                server.setKeyMaterial( km );
>
>                // These settings have to do with how we'll treat client
> certificates that are presented
>                // to us.  If the client doesn't present any client certificate,
> then these are ignored.
>                server.setCheckHostname( false ); // default setting is "false" for SSLServer
>                server.setCheckExpiry( true );    // default setting is "true" for SSLServer
>                server.setCheckCRL( true );       // default setting is "true" for SSLServer
>
>                // This server trusts all client certificates presented (usually
> people won't present
>                // client certs, but if they do, we'll give them a socket at the very least).
>                server.addTrustMaterial( new TrustMaterial("certs/truststore.jks",
> "123456".toCharArray()));
>
>                return server;
>        }
> }
>
>
>        JettyHTTPServerEngineFactory f =
> BusFactory.getDefaultBus().getExtension(JettyHTTPServerEngineFactory.class);
>        if(f==null) {
>                f = new JettyHTTPServerEngineFactory();
>                BusFactory.getDefaultBus().setExtension(f,
> JettyHTTPServerEngineFactory.class);
>        }
>
>        MySSLSocketConnector connector = new MySSLSocketConnector();
>        JettyHTTPServerEngine engine = f.createJettyHTTPServerEngine(8082, "http");
>        //reconfigure this engine to use https instead of http
>        engine.setTlsServerParameters(new TLSServerParameters());
>        engine.setConnector(connector);
>
>        JaxWsServerFactoryBean sf = new JaxWsServerFactoryBean();
>        sf.setServiceClass(Greeter.class);
>        sf.setAddress("https://localhost:8082/Greeter");
>
>        sf.getServiceFactory().setInvoker(new BeanInvoker(new GreeterImpl()));
>
>         org.apache.cxf.endpoint.Server server = sf.create();
>
>
> 2010/10/22 Daniel Kulp <dk...@apache.org>:
>> On Thursday 21 October 2010 8:03:35 pm Weihua JIANG wrote:
>>> Thank you Daniel. However, my question is: how to set
>>> SSLServerSocketFactory at server side, not at client side?
>>>
>>> At client side, for TlsClientParameters, I know there is a
>>> setSSLSocketFactory() method. However, I can't find solution to set a
>>> SSLServerSocketFactory at server side.
>>
>> Oh.  Sorry.  Misread.   Server side....   Hmmmm.....    This is digging into
>> Jetty code.
>>
>>
>> You're going to need to create a Jetty Connector object.  Most likely,
>> subclass the Jetty SslSocketConnector  and override the
>> createFactory call or similar.   Then set that into the CXF Jetty stuff via:
>>
>>
>> JettyHTTPServerEngineFactory f =
>> BusFactory.getDefaultBus().getExtension(JettyHTTPServerEngineFactory.class);
>>        if (f == null) {
>>            f = new JettyHTTPServerEngineFactory();
>>            BusFactory.getDefaultBus().setExtension(f,
>> JettyHTTPServerEngineFactory.class);
>>        }
>>
>>        f.createJettyHTTPServerEngine(8080, "http").setConnector(connector);
>>
>>
>> Hope that helps.
>> Dan
>>
>>
>>>
>>> Thanks
>>> Weihua
>>>
>>> 2010/10/22 Daniel Kulp <dk...@apache.org>:
>>> > On Thursday 21 October 2010 4:31:49 am Weihua JIANG wrote:
>>> >> Hi all,
>>> >>
>>> >> I want to use Not-Yet-Commons-SSL to handle SSL certificates. So, I
>>> >> prefer to use its SSLServerSocketFactory implementation for CXF
>>> >> endpoint publish. However, I can't find any document or sample on how
>>> >> to write code.
>>> >>
>>> >> Can anyone help me on this?
>>> >
>>> > It should be something like:
>>> >
>>> > Client client = ClientProxy.getClient(proxy);
>>> > HTTPConduit hc = (HTTPConduit)client.getConduit();
>>> > HTTPClientPolicy cp = hc.getClient();
>>> > cp.getTlsClientParameters().setSSLSocketFactory(factory);
>>> >
>>> > Hope that helps!
>>> > Dan
>>> >
>>> >> Thanks
>>> >> Weihua
>>> >
>>> > --
>>> > Daniel Kulp
>>> > dkulp@apache.org
>>> > http://dankulp.com/blog
>>
>> --
>> Daniel Kulp
>> dkulp@apache.org
>> http://dankulp.com/blog
>>
>

Re: How to use custom SSLServerSocketFactory to publish endpoints?

Posted by Weihua JIANG <we...@gmail.com>.
Hi Daniel,

I tried your solution, but failed. It seems the server is not created
at all. I can't connect to it either by browser or by wget.

Below is my code:
public class MySSLSocketConnector extends
org.eclipse.jetty.server.ssl.SslSocketConnector {

	@Override
	protected SSLServerSocketFactory createFactory() throws Exception {
		SSLServer server = new SSLServer();

		String pathToKeyMaterial = "certs/server.jks";
		char[] password = "123456".toCharArray();
		KeyMaterial km = new KeyMaterial( pathToKeyMaterial, password );

		server.setKeyMaterial( km );

		// These settings have to do with how we'll treat client
certificates that are presented
		// to us.  If the client doesn't present any client certificate,
then these are ignored.
		server.setCheckHostname( false ); // default setting is "false" for SSLServer
		server.setCheckExpiry( true );    // default setting is "true" for SSLServer
		server.setCheckCRL( true );       // default setting is "true" for SSLServer

		// This server trusts all client certificates presented (usually
people won't present
		// client certs, but if they do, we'll give them a socket at the very least).
		server.addTrustMaterial( new TrustMaterial("certs/truststore.jks",
"123456".toCharArray()));
		
		return server;
	}
}


    	JettyHTTPServerEngineFactory f =
BusFactory.getDefaultBus().getExtension(JettyHTTPServerEngineFactory.class);
    	if(f==null) {
    		f = new JettyHTTPServerEngineFactory();
    		BusFactory.getDefaultBus().setExtension(f,
JettyHTTPServerEngineFactory.class);
    	}
    	
    	MySSLSocketConnector connector = new MySSLSocketConnector();
    	JettyHTTPServerEngine engine = f.createJettyHTTPServerEngine(8082, "http");
    	//reconfigure this engine to use https instead of http
    	engine.setTlsServerParameters(new TLSServerParameters());
    	engine.setConnector(connector);

        JaxWsServerFactoryBean sf = new JaxWsServerFactoryBean();
        sf.setServiceClass(Greeter.class);
        sf.setAddress("https://localhost:8082/Greeter");

        sf.getServiceFactory().setInvoker(new BeanInvoker(new GreeterImpl()));

         org.apache.cxf.endpoint.Server server = sf.create();


2010/10/22 Daniel Kulp <dk...@apache.org>:
> On Thursday 21 October 2010 8:03:35 pm Weihua JIANG wrote:
>> Thank you Daniel. However, my question is: how to set
>> SSLServerSocketFactory at server side, not at client side?
>>
>> At client side, for TlsClientParameters, I know there is a
>> setSSLSocketFactory() method. However, I can't find solution to set a
>> SSLServerSocketFactory at server side.
>
> Oh.  Sorry.  Misread.   Server side....   Hmmmm.....    This is digging into
> Jetty code.
>
>
> You're going to need to create a Jetty Connector object.  Most likely,
> subclass the Jetty SslSocketConnector  and override the
> createFactory call or similar.   Then set that into the CXF Jetty stuff via:
>
>
> JettyHTTPServerEngineFactory f =
> BusFactory.getDefaultBus().getExtension(JettyHTTPServerEngineFactory.class);
>        if (f == null) {
>            f = new JettyHTTPServerEngineFactory();
>            BusFactory.getDefaultBus().setExtension(f,
> JettyHTTPServerEngineFactory.class);
>        }
>
>        f.createJettyHTTPServerEngine(8080, "http").setConnector(connector);
>
>
> Hope that helps.
> Dan
>
>
>>
>> Thanks
>> Weihua
>>
>> 2010/10/22 Daniel Kulp <dk...@apache.org>:
>> > On Thursday 21 October 2010 4:31:49 am Weihua JIANG wrote:
>> >> Hi all,
>> >>
>> >> I want to use Not-Yet-Commons-SSL to handle SSL certificates. So, I
>> >> prefer to use its SSLServerSocketFactory implementation for CXF
>> >> endpoint publish. However, I can't find any document or sample on how
>> >> to write code.
>> >>
>> >> Can anyone help me on this?
>> >
>> > It should be something like:
>> >
>> > Client client = ClientProxy.getClient(proxy);
>> > HTTPConduit hc = (HTTPConduit)client.getConduit();
>> > HTTPClientPolicy cp = hc.getClient();
>> > cp.getTlsClientParameters().setSSLSocketFactory(factory);
>> >
>> > Hope that helps!
>> > Dan
>> >
>> >> Thanks
>> >> Weihua
>> >
>> > --
>> > Daniel Kulp
>> > dkulp@apache.org
>> > http://dankulp.com/blog
>
> --
> Daniel Kulp
> dkulp@apache.org
> http://dankulp.com/blog
>

Re: How to use custom SSLServerSocketFactory to publish endpoints?

Posted by Daniel Kulp <dk...@apache.org>.
On Thursday 21 October 2010 8:03:35 pm Weihua JIANG wrote:
> Thank you Daniel. However, my question is: how to set
> SSLServerSocketFactory at server side, not at client side?
> 
> At client side, for TlsClientParameters, I know there is a
> setSSLSocketFactory() method. However, I can't find solution to set a
> SSLServerSocketFactory at server side.

Oh.  Sorry.  Misread.   Server side....   Hmmmm.....    This is digging into 
Jetty code.


You're going to need to create a Jetty Connector object.  Most likely, 
subclass the Jetty SslSocketConnector  and override the 
createFactory call or similar.   Then set that into the CXF Jetty stuff via:


JettyHTTPServerEngineFactory f = 
BusFactory.getDefaultBus().getExtension(JettyHTTPServerEngineFactory.class);
        if (f == null) {
            f = new JettyHTTPServerEngineFactory();
            BusFactory.getDefaultBus().setExtension(f, 
JettyHTTPServerEngineFactory.class);
        }
        
        f.createJettyHTTPServerEngine(8080, "http").setConnector(connector);


Hope that helps.
Dan


> 
> Thanks
> Weihua
> 
> 2010/10/22 Daniel Kulp <dk...@apache.org>:
> > On Thursday 21 October 2010 4:31:49 am Weihua JIANG wrote:
> >> Hi all,
> >> 
> >> I want to use Not-Yet-Commons-SSL to handle SSL certificates. So, I
> >> prefer to use its SSLServerSocketFactory implementation for CXF
> >> endpoint publish. However, I can't find any document or sample on how
> >> to write code.
> >> 
> >> Can anyone help me on this?
> > 
> > It should be something like:
> > 
> > Client client = ClientProxy.getClient(proxy);
> > HTTPConduit hc = (HTTPConduit)client.getConduit();
> > HTTPClientPolicy cp = hc.getClient();
> > cp.getTlsClientParameters().setSSLSocketFactory(factory);
> > 
> > Hope that helps!
> > Dan
> > 
> >> Thanks
> >> Weihua
> > 
> > --
> > Daniel Kulp
> > dkulp@apache.org
> > http://dankulp.com/blog

-- 
Daniel Kulp
dkulp@apache.org
http://dankulp.com/blog

Re: How to use custom SSLServerSocketFactory to publish endpoints?

Posted by Weihua JIANG <we...@gmail.com>.
Thank you Daniel. However, my question is: how to set
SSLServerSocketFactory at server side, not at client side?

At client side, for TlsClientParameters, I know there is a
setSSLSocketFactory() method. However, I can't find solution to set a
SSLServerSocketFactory at server side.

Thanks
Weihua

2010/10/22 Daniel Kulp <dk...@apache.org>:
> On Thursday 21 October 2010 4:31:49 am Weihua JIANG wrote:
>> Hi all,
>>
>> I want to use Not-Yet-Commons-SSL to handle SSL certificates. So, I
>> prefer to use its SSLServerSocketFactory implementation for CXF
>> endpoint publish. However, I can't find any document or sample on how
>> to write code.
>>
>> Can anyone help me on this?
>
> It should be something like:
>
> Client client = ClientProxy.getClient(proxy);
> HTTPConduit hc = (HTTPConduit)client.getConduit();
> HTTPClientPolicy cp = hc.getClient();
> cp.getTlsClientParameters().setSSLSocketFactory(factory);
>
> Hope that helps!
> Dan
>
>
>>
>>
>> Thanks
>> Weihua
>
> --
> Daniel Kulp
> dkulp@apache.org
> http://dankulp.com/blog
>

Re: How to use custom SSLServerSocketFactory to publish endpoints?

Posted by Daniel Kulp <dk...@apache.org>.
On Thursday 21 October 2010 4:31:49 am Weihua JIANG wrote:
> Hi all,
> 
> I want to use Not-Yet-Commons-SSL to handle SSL certificates. So, I
> prefer to use its SSLServerSocketFactory implementation for CXF
> endpoint publish. However, I can't find any document or sample on how
> to write code.
> 
> Can anyone help me on this?

It should be something like:

Client client = ClientProxy.getClient(proxy);
HTTPConduit hc = (HTTPConduit)client.getConduit();
HTTPClientPolicy cp = hc.getClient();
cp.getTlsClientParameters().setSSLSocketFactory(factory);

Hope that helps!
Dan


> 
> 
> Thanks
> Weihua

-- 
Daniel Kulp
dkulp@apache.org
http://dankulp.com/blog

How to use custom SSLServerSocketFactory to publish endpoints?

Posted by Weihua JIANG <we...@gmail.com>.
Hi all,

I want to use Not-Yet-Commons-SSL to handle SSL certificates on server
side. So, I
prefer to use its SSLServerSocketFactory implementation for CXF
endpoint publish. However, I can't find any document or sample on how
to write code.

Can anyone help me on this?


Thanks
Weihua