You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@olingo.apache.org by "Feby Baby (JIRA)" <ji...@apache.org> on 2017/12/15 06:08:00 UTC
[jira] [Updated] (OLINGO-1216) How to consume Odata service having
self-signed certificate using Olingo in java?
[ https://issues.apache.org/jira/browse/OLINGO-1216?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Feby Baby updated OLINGO-1216:
------------------------------
Description:
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:
bq. [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
bq.
bq. sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
bq. at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) ~[na:1.8.0_92]
bq. at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) ~[na:1.8.0_92]
bq. at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) ~[na:1.8.0_92]
bq. at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382) ~[na:1.8.0_92]
bq. at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) ~[na:1.8.0_92]
bq. at sun.security.validator.Validator.validate(Validator.java:260) ~[na:1.8.0_92]
bq. at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) ~[na:1.8.0_92]
bq. at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229) ~[na:1.8.0_92]
bq. at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124) ~[na:1.8.0_92]
bq. at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1491) ~[na:1.8.0_92]
bq. at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216) ~[na:1.8.0_92]
bq. at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979) ~[na:1.8.0_92]
bq. at sun.security.ssl.Handshaker.process_record(Handshaker.java:914) ~[na:1.8.0_92]
bq. at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062) ~[na:1.8.0_92]
bq. at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) ~[na:1.8.0_92]
bq. at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) ~[na:1.8.0_92]
bq. at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) ~[na:1.8.0_92]
bq. at org.apache.http.conn.ssl.SSLSocketFactory.createLayeredSocket(SSLSocketFactory.java:573) ~[httpclient-4.5.3.jar:4.5.3]
bq. at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:557) ~[httpclient-4.5.3.jar:4.5.3]
bq. at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:414) ~[httpclient-4.5.3.jar:4.5.3]
bq. at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180) ~[httpclient-4.5.3.jar:4.5.3]
bq. at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:326) ~[httpclient-4.5.3.jar:4.5.3]
bq. at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:610) ~[httpclient-4.5.3.jar:4.5.3]
bq. at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:445) ~[httpclient-4.5.3.jar:4.5.3]
bq. at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:835) ~[httpclient-4.5.3.jar:4.5.3]
bq. at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) ~[httpclient-4.5.3.jar:4.5.3]
bq. at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108) ~[httpclient-4.5.3.jar:4.5.3]
bq. at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) ~[httpclient-4.5.3.jar:4.5.3]
bq. at org.apache.olingo.client.core.communication.request.AbstractODataRequest.doExecute(AbstractODataRequest.java:301) ~[odata-client-core-4.4.0.jar:na]
bq. at org.apache.olingo.client.core.communication.request.retrieve.ODataEntitySetIteratorRequestImpl.execute(ODataEntitySetIteratorRequestImpl.java:59) ~[odata-client-core-4.4.0.jar:na]
bq. at org.apache.olingo.client.core.communication.request.retrieve.ODataEntitySetIteratorRequestImpl.execute(ODataEntitySetIteratorRequestImpl.java:36) ~[odata-client-core-4.4.0.jar:na]
bq.
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/
was:
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/
> 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:
> bq. [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
> bq.
> bq. sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
> bq. at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) ~[na:1.8.0_92]
> bq. at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) ~[na:1.8.0_92]
> bq. at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) ~[na:1.8.0_92]
> bq. at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382) ~[na:1.8.0_92]
> bq. at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) ~[na:1.8.0_92]
> bq. at sun.security.validator.Validator.validate(Validator.java:260) ~[na:1.8.0_92]
> bq. at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) ~[na:1.8.0_92]
> bq. at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229) ~[na:1.8.0_92]
> bq. at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124) ~[na:1.8.0_92]
> bq. at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1491) ~[na:1.8.0_92]
> bq. at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216) ~[na:1.8.0_92]
> bq. at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979) ~[na:1.8.0_92]
> bq. at sun.security.ssl.Handshaker.process_record(Handshaker.java:914) ~[na:1.8.0_92]
> bq. at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062) ~[na:1.8.0_92]
> bq. at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) ~[na:1.8.0_92]
> bq. at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) ~[na:1.8.0_92]
> bq. at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) ~[na:1.8.0_92]
> bq. at org.apache.http.conn.ssl.SSLSocketFactory.createLayeredSocket(SSLSocketFactory.java:573) ~[httpclient-4.5.3.jar:4.5.3]
> bq. at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:557) ~[httpclient-4.5.3.jar:4.5.3]
> bq. at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:414) ~[httpclient-4.5.3.jar:4.5.3]
> bq. at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180) ~[httpclient-4.5.3.jar:4.5.3]
> bq. at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:326) ~[httpclient-4.5.3.jar:4.5.3]
> bq. at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:610) ~[httpclient-4.5.3.jar:4.5.3]
> bq. at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:445) ~[httpclient-4.5.3.jar:4.5.3]
> bq. at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:835) ~[httpclient-4.5.3.jar:4.5.3]
> bq. at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) ~[httpclient-4.5.3.jar:4.5.3]
> bq. at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108) ~[httpclient-4.5.3.jar:4.5.3]
> bq. at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) ~[httpclient-4.5.3.jar:4.5.3]
> bq. at org.apache.olingo.client.core.communication.request.AbstractODataRequest.doExecute(AbstractODataRequest.java:301) ~[odata-client-core-4.4.0.jar:na]
> bq. at org.apache.olingo.client.core.communication.request.retrieve.ODataEntitySetIteratorRequestImpl.execute(ODataEntitySetIteratorRequestImpl.java:59) ~[odata-client-core-4.4.0.jar:na]
> bq. at org.apache.olingo.client.core.communication.request.retrieve.ODataEntitySetIteratorRequestImpl.execute(ODataEntitySetIteratorRequestImpl.java:36) ~[odata-client-core-4.4.0.jar:na]
> bq.
> 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)