¿Cómo habilitar TLS / SSL en Java, Spring / CXF para el servicio web?

Tengo un servicio web simple definido en la configuración de Spring:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cxf="http://cxf.apache.org/core"
xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:wsa="http://cxf.apache.org/ws/addressing"
xmlns:http="http://cxf.apache.org/transports/http/configuration"
xmlns:wsrm-policy="http://schemas.xmlsoap.org/ws/2005/02/rm/policy"
xmlns:wsrm-mgr="http://cxf.apache.org/ws/rm/manager"
xmlns:httpj="http://cxf.apache.org/transports/http-jetty/configuration"
xsi:schemaLocation="
    http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd
    http://schemas.xmlsoap.org/ws/2005/02/rm/policy http://schemas.xmlsoap.org/ws/2005/02/rm/wsrm-policy.xsd
    http://cxf.apache.org/ws/rm/manager http://cxf.apache.org/schemas/configuration/wsrm-manager.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
    http://cxf.apache.org/transports/http-jetty/configuration http://cxf.apache.org/schemas/configuration/http-jetty.xsd">

<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-*.xml" />

<bean id="logInbound" class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
<bean id="logOutbound" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>

<bean id="cxf" class="org.apache.cxf.bus.CXFBusImpl">
    <property name="inInterceptors">
        <list>
            <ref bean="logInbound"/>
        </list>
    </property>
    <property name="outInterceptors">
        <list>
            <ref bean="logOutbound"/>
        </list>
    </property>
    <property name="outFaultInterceptors">
        <list>
            <ref bean="logOutbound"/>
        </list>
    </property>
    <property name="inFaultInterceptors">
        <list>
            <ref bean="logInbound"/>
        </list>
    </property>
</bean>

<httpj:engine-factory bus="cxf">
    <httpj:engine port="9001">
        <httpj:threadingParameters minThreads="10" maxThreads="100" />
        <httpj:connector>
            <bean class="org.eclipse.jetty.server.bio.SocketConnector">
                <property name="port" value="9001" />
            </bean>
        </httpj:connector>
        <httpj:handlers>
            <bean class="org.eclipse.jetty.server.handler.DefaultHandler" />
        </httpj:handlers>
        <httpj:sessionSupport>true</httpj:sessionSupport>
    </httpj:engine>
</httpj:engine-factory>

<bean id="serviceFactory" class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean"
    scope="prototype">
    <property name="serviceConfigurations">
        <list>
            <bean class="org.apache.cxf.jaxws.support.JaxWsServiceConfiguration" />
            <bean
                class="org.apache.cxf.aegis.databinding.XFireCompatibilityServiceConfiguration" />
            <bean class="org.apache.cxf.service.factory.DefaultServiceConfiguration" />
        </list>
    </property>
</bean>

<bean id="eventWebService" class="org.myapp.EventWS">
    <property name="timeout" value="${timeoutWS}" />
</bean>

<jaxws:endpoint id="event" implementor="#eventWebService"
    address="${event.endpoint}">
    <jaxws:serviceFactory>
        <ref bean="serviceFactory" />
    </jaxws:serviceFactory>
</jaxws:endpoint>

Funciona como un simple WS en event.endpoint = http: // localhost: 9001 / event

Pero ahora, quiero asegurar esa conexión con TLS usando la clave privada del servidor. Sé cómo hacerlo utilizando SSLContext ( http://download.oracle.com/javase/6/docs/api/javax/net/ssl/SSLContext.html ), pero Spring es algo nuevo para mí. ¿Supongo que necesito crear un nuevo Endpoint con otra configuración? ¿O usar otro ServiceFactory?

Respuesta 1

Debe configurar la fábrica del motor con un conector habilitado para SSL. Tal vez esto ayude: http://docs.codehaus.org/display/JETTY/How+to+configure+SSL

Respuesta: 2

He logrado crear un nuevo motor con SSL

<httpj:engine port="9101">
        <httpj:tlsServerParameters>
            <sec:clientAuthentication want="true"
                required="true" />
        </httpj:tlsServerParameters>

        <httpj:threadingParameters minThreads="10"
            maxThreads="100" />
        <httpj:connector>
            <bean class="org.eclipse.jetty.server.ssl.SslSocketConnector">
                <property name="port" value="9101" />
                <property name="keystore" value= "./config/keystore-gateway" />
                <property name="password" value= "pass" />
                <property name="keyPassword" value= "pass" />
            </bean>
        </httpj:connector>
        <httpj:handlers>
            <bean class="org.eclipse.jetty.server.handler.DefaultHandler" />
        </httpj:handlers>
        <httpj:sessionSupport>true</httpj:sessionSupport>
    </httpj:engine>

Funciona en navegador con SSL.

¿Cómo habilitar la autenticación mutua ahora?

Respuesta: 3

He creado un cliente de servicio web que importa un wsdl de terceros en eclipse. Pero obtuve esta excepción: javax.xml.ws.WebServiceException: Connection IO Exception. Verifique la excepción anidada para más detalles. (...

Muchos hilos están escribiendo StringBuffer en el mismo archivo. StringBuffer contiene alrededor de 100 líneas. ¿Cuál es la salida en el archivo si varios hilos escriben en el mismo archivo? Es cada salida de diferentes hilos ...

Desarrollé una pequeña aplicación de escritorio en Java. En alguna posición de mi IU, arrastro y suelto un JLabel de Palette a JFrame. Más tarde, elimino su texto haciendo clic derecho -> Editar texto. Hice esto porque yo ...

Declaro dos matrices y las inicialicé en las declaraciones de campo: el siguiente es el ejemplo: Cadena final [] columnNames = {"Nombre", "Apellido", "Deporte", "N.º de años", "Vegetariano"}; final ...