From e78bfe13bb52196ad84e68f4d4aa476aad1b6c52 Mon Sep 17 00:00:00 2001 From: Tomasz Wrobel Date: Thu, 20 Feb 2020 16:45:12 +0100 Subject: Add HttpClient Issue-ID: AAF-996 Signed-off-by: Tomasz Wrobel Change-Id: I3ebb0ea88ef1a72c16064fd9a1931943b57410d8 --- .../aaf/certservice/client/CertServiceClient.java | 15 ++- .../onap/aaf/certservice/client/api/ExitCode.java | 4 +- .../certservice/client/api/ExitableException.java | 1 - .../aaf/certservice/client/common/Base64Coder.java | 29 ++++++ .../httpclient/CloseableHttpClientProvider.java | 40 ++++++++ .../certservice/client/httpclient/HttpClient.java | 109 +++++++++++++++++++++ .../exception/CertServiceApiResponseException.java | 42 ++++++++ .../httpclient/exception/HttpClientException.java | 37 +++++++ .../httpclient/model/CertServiceResponse.java | 44 +++++++++ .../httpclient/model/ErrorCertServiceResponse.java | 40 ++++++++ 10 files changed, 358 insertions(+), 3 deletions(-) create mode 100644 certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/Base64Coder.java create mode 100644 certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/CloseableHttpClientProvider.java create mode 100644 certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/HttpClient.java create mode 100644 certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/exception/CertServiceApiResponseException.java create mode 100644 certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/exception/HttpClientException.java create mode 100644 certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/model/CertServiceResponse.java create mode 100644 certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/model/ErrorCertServiceResponse.java (limited to 'certServiceClient/src/main/java') diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/CertServiceClient.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/CertServiceClient.java index 3e8f73eb..59d0c032 100644 --- a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/CertServiceClient.java +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/CertServiceClient.java @@ -28,12 +28,16 @@ import org.onap.aaf.certservice.client.configuration.factory.ClientConfiguration import org.onap.aaf.certservice.client.configuration.factory.CsrConfigurationFactory; import org.onap.aaf.certservice.client.configuration.model.ClientConfiguration; import org.onap.aaf.certservice.client.configuration.model.CsrConfiguration; +import org.onap.aaf.certservice.client.httpclient.CloseableHttpClientProvider; +import org.onap.aaf.certservice.client.httpclient.HttpClient; +import org.onap.aaf.certservice.client.httpclient.model.CertServiceResponse; import java.security.KeyPair; import static org.onap.aaf.certservice.client.api.ExitCode.SUCCESS_EXIT_CODE; import static org.onap.aaf.certservice.client.certification.EncryptionAlgorithmConstants.KEY_SIZE; import static org.onap.aaf.certservice.client.certification.EncryptionAlgorithmConstants.RSA_ENCRYPTION_ALGORITHM; +import static org.onap.aaf.certservice.client.common.Base64Coder.encode; public class CertServiceClient { private AppExitHandler appExitHandler; @@ -49,7 +53,16 @@ public class CertServiceClient { CsrConfiguration csrConfiguration = new CsrConfigurationFactory(new EnvsForCsr()).create(); KeyPair keyPair = keyPairFactory.create(); CsrFactory csrFactory = new CsrFactory(csrConfiguration); - String csr = csrFactory.createEncodedCsr(keyPair); + + CloseableHttpClientProvider provider = new CloseableHttpClientProvider(clientConfiguration.getRequestTimeout()); + HttpClient httpClient = new HttpClient(provider, clientConfiguration.getUrlToCertService()); + + CertServiceResponse certServiceData = + httpClient.retrieveCertServiceData( + clientConfiguration.getCaName(), + csrFactory.createEncodedCsr(keyPair), + encode(keyPair.getPrivate().toString())); + } catch (ExitableException e) { appExitHandler.exit(e.applicationExitCode()); } diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/api/ExitCode.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/api/ExitCode.java index 45f2c400..b72a0e2d 100644 --- a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/api/ExitCode.java +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/api/ExitCode.java @@ -23,7 +23,9 @@ public enum ExitCode { CLIENT_CONFIGURATION_EXCEPTION(1), CSR_CONFIGURATION_EXCEPTION(2), KEY_PAIR_GENERATION_EXCEPTION(3), - CSR_GENERATION_EXCEPTION(4); + CSR_GENERATION_EXCEPTION(4), + CERT_SERVICE_API_CONNECTION_EXCEPTION(5), + HTTP_CLIENT_EXCEPTION(6); private final int value; diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/api/ExitableException.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/api/ExitableException.java index 51981a48..f9166c96 100644 --- a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/api/ExitableException.java +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/api/ExitableException.java @@ -26,6 +26,5 @@ public abstract class ExitableException extends Exception { public ExitableException(String message) { super(message); } - public abstract int applicationExitCode(); } diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/Base64Coder.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/Base64Coder.java new file mode 100644 index 00000000..c066187d --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/Base64Coder.java @@ -0,0 +1,29 @@ +/* + * ============LICENSE_START======================================================= + * aaf-certservice-client + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.aaf.certservice.client.common; + +import org.bouncycastle.util.encoders.Base64; + +public class Base64Coder { + public static String encode(String string){ + return new String(Base64.encode(string.getBytes())); + } +} diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/CloseableHttpClientProvider.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/CloseableHttpClientProvider.java new file mode 100644 index 00000000..ff29a14d --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/CloseableHttpClientProvider.java @@ -0,0 +1,40 @@ +/* + * ============LICENSE_START======================================================= + * aaf-certservice-client + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.aaf.certservice.client.httpclient; + +import org.apache.http.client.config.RequestConfig; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; + +public class CloseableHttpClientProvider { + + private final int timeout; + + public CloseableHttpClientProvider(int timeout) { + this.timeout = timeout; + } + + public CloseableHttpClient getClient() { + RequestConfig config = + RequestConfig.custom().setConnectionRequestTimeout(timeout).build(); + return HttpClientBuilder.create().setDefaultRequestConfig(config).build(); + } +} diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/HttpClient.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/HttpClient.java new file mode 100644 index 00000000..603d5848 --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/HttpClient.java @@ -0,0 +1,109 @@ +/* + * ============LICENSE_START======================================================= + * aaf-certservice-client + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.aaf.certservice.client.httpclient; + +import com.google.gson.Gson; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.util.EntityUtils; +import org.onap.aaf.certservice.client.httpclient.exception.CertServiceApiResponseException; +import org.onap.aaf.certservice.client.httpclient.exception.HttpClientException; +import org.onap.aaf.certservice.client.httpclient.model.CertServiceResponse; +import org.onap.aaf.certservice.client.httpclient.model.ErrorCertServiceResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; + +public class HttpClient { + + private static final String CSR_HEADER_NAME = "CSR"; + private static final String PK_HEADER_NAME = "PK"; + private static final String CHARSET_UTF_8 = "UTF-8"; + + private final Logger LOGGER = LoggerFactory.getLogger(HttpClient.class); + + private final Gson gson = new Gson(); + private final CloseableHttpClientProvider httpClientProvider; + private final String certServiceAddress; + + public HttpClient(CloseableHttpClientProvider httpClientProvider, String certServiceAddress) { + this.httpClientProvider = httpClientProvider; + this.certServiceAddress = certServiceAddress; + } + + public CertServiceResponse retrieveCertServiceData(String caName, String csr, String encodedPk) + throws CertServiceApiResponseException, HttpClientException { + + try (CloseableHttpClient httpClient = httpClientProvider.getClient()) { + HttpResponse httpResponse = httpClient.execute(createHttpPayload(caName, csr, encodedPk)); + return extractCertServiceResponse(httpResponse); + + } catch (IOException e) { + LOGGER.error(String.format("Failed on communication between client and API for URL: '%s' . Exception message: '%s'", + certServiceAddress + caName, e.getMessage())); + throw new HttpClientException(e); + } + } + + private int getStatusCode(HttpResponse httpResponse) { + return httpResponse.getStatusLine().getStatusCode(); + } + + private CertServiceResponse extractCertServiceResponse(HttpResponse httpResponse) + throws CertServiceApiResponseException, IOException { + int httpResponseCode = getStatusCode(httpResponse); + if (HttpStatus.SC_OK != httpResponseCode) { + LOGGER.error(String.format("Error on API response. Response Code: %d", httpResponseCode)); + throw generateApiResponseException(httpResponse); + } + String jsonResponse = getStringResponse(httpResponse.getEntity()); + return gson.fromJson(jsonResponse, CertServiceResponse.class); + } + + private String getStringResponse(HttpEntity httpEntity) throws IOException { + return EntityUtils.toString(httpEntity, CHARSET_UTF_8); + } + + private HttpGet createHttpPayload(String caName, String csr, String pk) { + String url = certServiceAddress + caName; + HttpGet httpGet = new HttpGet(url); + httpGet.addHeader(CSR_HEADER_NAME, csr); + httpGet.addHeader(PK_HEADER_NAME, pk); + return httpGet; + } + + + private CertServiceApiResponseException generateApiResponseException(HttpResponse httpResponse) throws IOException { + String stringResponse = getStringResponse(httpResponse.getEntity()); + ErrorCertServiceResponse errorCertServiceResponse = + gson.fromJson(stringResponse, ErrorCertServiceResponse.class); + + String messageFromApi = errorCertServiceResponse.getMessage(); + String path = errorCertServiceResponse.getPath(); + int httpResponseCode = getStatusCode(httpResponse); + + return new CertServiceApiResponseException(certServiceAddress + path, httpResponseCode, messageFromApi); + } +} diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/exception/CertServiceApiResponseException.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/exception/CertServiceApiResponseException.java new file mode 100644 index 00000000..40470af3 --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/exception/CertServiceApiResponseException.java @@ -0,0 +1,42 @@ +/* + * ============LICENSE_START======================================================= + * aaf-certservice-client + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.aaf.certservice.client.httpclient.exception; + +import org.onap.aaf.certservice.client.api.ExitCode; +import org.onap.aaf.certservice.client.api.ExitableException; + +public class CertServiceApiResponseException extends ExitableException { + private final ExitCode EXIT_CODE = ExitCode.CERT_SERVICE_API_CONNECTION_EXCEPTION; + + public CertServiceApiResponseException(String url, int responseCode, String messageFromAPI) { + + super(String.format("Request failed for URL '%s'. Response code: %d . Message from API: %s", + url, + responseCode, + messageFromAPI)); + } + + @Override + public int applicationExitCode() { + return EXIT_CODE.getValue(); + } + +} diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/exception/HttpClientException.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/exception/HttpClientException.java new file mode 100644 index 00000000..d6fb1461 --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/exception/HttpClientException.java @@ -0,0 +1,37 @@ +/* + * ============LICENSE_START======================================================= + * aaf-certservice-client + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.aaf.certservice.client.httpclient.exception; + +import org.onap.aaf.certservice.client.api.ExitCode; +import org.onap.aaf.certservice.client.api.ExitableException; + +public class HttpClientException extends ExitableException { + private final ExitCode EXIT_CODE = ExitCode.HTTP_CLIENT_EXCEPTION; + + public HttpClientException(Throwable e) { + super(e); + } + + @Override + public int applicationExitCode() { + return EXIT_CODE.getValue(); + } +} diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/model/CertServiceResponse.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/model/CertServiceResponse.java new file mode 100644 index 00000000..4ca17999 --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/model/CertServiceResponse.java @@ -0,0 +1,44 @@ +/* + * ============LICENSE_START======================================================= + * aaf-certservice-client + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.aaf.certservice.client.httpclient.model; + +import java.util.Collections; +import java.util.List; + +public class CertServiceResponse { + + private final List certificateChain; + private final List trustedCertificates; + + public CertServiceResponse(List certificateChain, List trustedCertificates) { + this.certificateChain = certificateChain; + this.trustedCertificates = trustedCertificates; + } + + public List getCertificateChain() { + return Collections.unmodifiableList(certificateChain); + } + + public List getTrustedCertificates() { + return Collections.unmodifiableList(trustedCertificates); + } + +} diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/model/ErrorCertServiceResponse.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/model/ErrorCertServiceResponse.java new file mode 100644 index 00000000..6fe99ce5 --- /dev/null +++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/model/ErrorCertServiceResponse.java @@ -0,0 +1,40 @@ +/* + * ============LICENSE_START======================================================= + * aaf-certservice-client + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.aaf.certservice.client.httpclient.model; + +public class ErrorCertServiceResponse { + + private final String message; + private final String path; + + public ErrorCertServiceResponse(String message, String path) { + this.message = message; + this.path = path; + } + + public String getMessage() { + return message; + } + + public String getPath() { + return path; + } +} -- cgit 1.2.3-korg