0
votes

I am getting the following error while instantiating a web application on WebSphere Liberty beta. The application starts successfully on WebSphere Application Server 8.5.5

Caused by: java.lang.NoClassDefFoundError: com.ibm.websphere.ssl.SSLException
    at java.lang.J9VMInternals.verifyImpl(Native Method)
    at java.lang.J9VMInternals.verify(J9VMInternals.java:93)
    at java.lang.J9VMInternals.verify(J9VMInternals.java:91)
    at java.lang.J9VMInternals.prepare(J9VMInternals.java:490)
    at java.lang.Class.getDeclaredConstructors(Class.java:553)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:231)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1002)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:975)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:487)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:633)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:410)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
    at com.ibm.ws.webcontainer.webapp.WebApp.notifyServletContextCreated(WebApp.java:2381)
    ... 1 more

Please provide any pointers that could help me resolve this. Here is server.xml for liberty server:

<server description="new server">

    <!-- Enable features -->


    <!-- To access this server from a remote client add a host attribute to 
        the following element, e.g. host="*" -->

    <featureManager>
        <feature>beanValidation-1.1</feature>
        <feature>jdbc-4.0</feature>
        <feature>jaxb-2.2</feature>
        <feature>localConnector-1.0</feature>
        <feature>jaxws-2.2</feature>       
        <feature>distributedMap-1.0</feature>   

        <feature>servlet-3.0</feature>
        <feature>ssl-1.0</feature>
    </featureManager>
     <include location="GeneratedSSLInclude.xml"/>

    <httpEndpoint httpPort="9081" httpsPort="9444" id="defaultHttpEndpoint"/>

    <logging consoleLogLevel="INFO" traceSpecification="javax.validation *=info:javax.validation.*=finest"/>
    <library id="JAX-RS2">
        <fileset dir="C:\workspace_eclipse\JAX-RS2\lib" includes="*.jar" scanInterval="5"/>

    </library>

    <applicationMonitor updateTrigger="mbean"/>

    <enterpriseApplication id="ProductServiceEAR" location="ProductServiceEAR-1.0.ear" name="ProductServiceEAR">
     <classloader privateLibraryRef="JAX-RS2"/>
    </enterpriseApplication>


     <keyStore id="defaultKeyStore" password="{xor}AXnKzg6TSmwMw=="/> -->
</server>

EDIT: The exception is thrown while generating spring jax-ws client bean. My application-context.xml file for the webservice client looks like:

<bean id="searchWebServiceClient"
        class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
        <property name="serviceInterface"
            value="au.com.test.search.SearchWebServiceClient" />
        <property name="wsdlDocumentUrl" value="classpath:/ServiceSchemas/involvedPartyManagement/involvedPartyManagement/SearchWebService_v2.wsdl" />
        <property name="namespaceUri"
            value="http://www.test.com.au/gn/involvedPartyManagement/services/SearchWebService/v2/WS0234" />
        <property name="serviceName"
            value="SearchWebService" />
        <property name="endpointAddress" value="${WS0234v2}" />     
    </bean>
2
Hi Micky, this should not be linked to code. May be including any jars in the liberty server or setting some configuration parameter. - pawinder gupta
OK. It wasn't quite clear which application it was. Maybe one for the Websphere support forums then considering it is beta? - Micky
Which jre do you use? - Jens
IBM J9 VM (build 2.6, JRE 1.7.0 Windows 7 amd64-64 Compressed References 20130421_145945 (JIT enabled, AOT enabled) - pawinder gupta

2 Answers

0
votes

SSL by default is not enabled on Liberty. Did you add ssl-1.0 feature to your server.xml and configured according to this page Enabling SSL communication for the Liberty profile.

PS. Add your server.xml file to the question.

If you are using JVM from full WebSphere, you need to change SSL factories. Create jvm.options file in the server directory with the following content:

-Djava.security.properties=./myjava.security

Create myjava.security file in the server directory with the following content (empty properties):

 ssl.SocketFactory.provider=
 ssl.ServerSocketFactory.provider=

Alternatively, test your application with Liberty running on Oracle JVM.

0
votes
    You need to add transportSecurity feature type in server.xml as:

    <feature>transportSecurity-1.0</feature>

    and also add SSL configuration (see below a prescription from server.xml) so that it could create SSLContext using SPI in your code -- something like:
    JSSEHelper.getInstance().getSSLContext("sslContextName", null, null);

    <!-- SSL config -->
    <keyStore id="sslKeyStore" location="${ssl.keystore.location}" password="${ssl.password}"/>
    <keyStore id="sslTrustStore" location="${ssl.truststore.location}" password="${ssl.password}"/>

    <ssl id="sslContextName" sslProtocol="TLSv1" securityLevel="HIGH" keyStoreRef="sslKeyStore" trustStoreRef="sslTrustStore" clientAuthenticationSupported="true" >
         <outboundConnection host="${some.service.host}" port="${some.service.port}" />
    </ssl>

    Remember - you need to run your app under Liberty profile. If not then you put it inside try()/catch() block -- something like:

    try {
         return JSSEHelper.getInstance().getSSLContext("sslContextName", null, null);
        } 
        catch (SSLException | NoClassDefFoundError e) {
         return SSLContextBuilder
        .create()
        .loadTrustMaterial(
Paths.get(webServiceClientConfig.getTrustStore()).toFile(), webServiceClientConfig.getSslPassword().toCharArray())
                        .build();
            }