Feby Baby created OLINGO-1216:
---------------------------------

             Summary: How to consume Odata service having self-signed 
certificate using Olingo in java?
                 Key: OLINGO-1216
                 URL: https://issues.apache.org/jira/browse/OLINGO-1216
             Project: Olingo
          Issue Type: Question
          Components: odata4-client
    Affects Versions: (Java) V4 4.4.0
         Environment: java, Spring boot
            Reporter: Feby Baby
            Priority: Blocker


I am trying to consume Redfish API which uses OData service in Java using 
Spring boot application. 

I understand that Olingo and Odata4j are the java libraries for consuming OData 
service. I tried using Olingo but getting error as the https server is having a 
self-signed certificate. Initially, I tried to access the redfish API using 
RestTemplate which worked out well. But for getting  @odata.id tag information, 
we need to use the OData specific library.

Sample json output of Redfish API:

    {
    @odata.context: "/redfish/v1/$metadata#ServiceRoot.ServiceRoot",
    @odata.id: "/redfish/v1",
    @odata.type: "#ServiceRoot.v1_0_2.ServiceRoot",
    AccountService: {
    @odata.id: "/redfish/v1/Managers/iDRAC.Embedded.1/AccountService"
    },
    Chassis: {
    @odata.id: "/redfish/v1/Chassis"
    },
    Description: "Root Service",
    EventService: {
    @odata.id: "/redfish/v1/EventService"
    },
    Id: "RootService",
    JsonSchemas: {
    @odata.id: "/redfish/v1/JSONSchemas"
    },
    Links: {
    Sessions: {
    @odata.id: "/redfish/v1/Sessions"
    }
    },
    Managers: {
    @odata.id: "/redfish/v1/Managers"
    },
    Name: "Root Service",
    RedfishVersion: "1.0.2",
    Registries: {
    @odata.id: "/redfish/v1/Registries"
    },
    SessionService: {
    @odata.id: "/redfish/v1/SessionService"
    },
    Systems: {
    @odata.id: "/redfish/v1/Systems"
    },
    Tasks: {
    @odata.id: "/redfish/v1/TaskService"
    }
    }

Code:

    ODataClient client = ODataClientFactory.getClient();
    String serviceUrl = "https://IP_address/redfish/v1/Systems/";;
    client.getConfiguration().setHttpClientFactory(new 
BasicAuthHttpClientFactory("[uname]", "[pswd]"));
    URI absoluteUri = client.newURIBuilder(serviceUrl).build();
    ODataEntitySetIteratorRequest<ClientEntitySet, ClientEntity> request = 
client.getRetrieveRequestFactory().getEntitySetIteratorRequest(absoluteUri);
                
    // odata4 sample/server limitation not handling metadata=full
    request.setAccept("application/json;odata.metadata=minimal");
                
    ODataRetrieveResponse<ClientEntitySetIterator<ClientEntitySet, 
ClientEntity>> response = request.execute(); 
    ClientEntitySetIterator<ClientEntitySet, ClientEntity> iterator = 
response.getBody();

I am getting the following certificate related error while trying to consume 
the OData service API:

    [Request processing failed; nested exception is 
org.apache.olingo.client.api.http.HttpClientException: 
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: 
PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: unable to find 
valid certification path to requested target] with root cause
    
    sun.security.provider.certpath.SunCertPathBuilderException: unable to find 
valid certification path to requested target
        at 
sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
 ~[na:1.8.0_92]
        at 
sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
 ~[na:1.8.0_92]
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) 
~[na:1.8.0_92]
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382) 
~[na:1.8.0_92]
        at 
sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) 
~[na:1.8.0_92]
        at sun.security.validator.Validator.validate(Validator.java:260) 
~[na:1.8.0_92]
        at 
sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) 
~[na:1.8.0_92]
        at 
sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
 ~[na:1.8.0_92]
        at 
sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
 ~[na:1.8.0_92]
        at 
sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1491) 
~[na:1.8.0_92]
        at 
sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216) 
~[na:1.8.0_92]
        at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979) 
~[na:1.8.0_92]
        at sun.security.ssl.Handshaker.process_record(Handshaker.java:914) 
~[na:1.8.0_92]
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062) 
~[na:1.8.0_92]
        at 
sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) 
~[na:1.8.0_92]
        at 
sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) 
~[na:1.8.0_92]
        at 
sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) 
~[na:1.8.0_92]
        at 
org.apache.http.conn.ssl.SSLSocketFactory.createLayeredSocket(SSLSocketFactory.java:573)
 ~[httpclient-4.5.3.jar:4.5.3]
        at 
org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:557)
 ~[httpclient-4.5.3.jar:4.5.3]
        at 
org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:414)
 ~[httpclient-4.5.3.jar:4.5.3]
        at 
org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
 ~[httpclient-4.5.3.jar:4.5.3]
        at 
org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:326)
 ~[httpclient-4.5.3.jar:4.5.3]
        at 
org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:610)
 ~[httpclient-4.5.3.jar:4.5.3]
        at 
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:445)
 ~[httpclient-4.5.3.jar:4.5.3]
        at 
org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:835)
 ~[httpclient-4.5.3.jar:4.5.3]
        at 
org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
 ~[httpclient-4.5.3.jar:4.5.3]
        at 
org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
 ~[httpclient-4.5.3.jar:4.5.3]
        at 
org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
 ~[httpclient-4.5.3.jar:4.5.3]
        at 
org.apache.olingo.client.core.communication.request.AbstractODataRequest.doExecute(AbstractODataRequest.java:301)
 ~[odata-client-core-4.4.0.jar:na]
        at 
org.apache.olingo.client.core.communication.request.retrieve.ODataEntitySetIteratorRequestImpl.execute(ODataEntitySetIteratorRequestImpl.java:59)
 ~[odata-client-core-4.4.0.jar:na]
        at 
org.apache.olingo.client.core.communication.request.retrieve.ODataEntitySetIteratorRequestImpl.execute(ODataEntitySetIteratorRequestImpl.java:36)
 ~[odata-client-core-4.4.0.jar:na]


Kindly help me to resolve the issue.

Please find below the links which I referred.

[https://templth.wordpress.com/2015/04/27/implementing-an-odata-service-with-olingo/][1]


  [1]: 
https://templth.wordpress.com/2015/04/27/implementing-an-odata-service-with-olingo/





--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to