Llamar a API internas que tienen certificados privados
AEM Obtenga información sobre cómo realizar llamadas HTTPS desde la a las API web mediante certificados privados o autofirmados.
De forma predeterminada, al intentar establecer una conexión HTTPS con una API web que utiliza un certificado firmado automáticamente, la conexión falla con el siguiente error:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Este problema suele ocurrir cuando el certificado SSL de la API no es emitido por una entidad de certificación (CA) reconocida y la aplicación Java™ no puede validar el certificado SSL/TLS.
AEM Vamos a aprender a llamar correctamente a las API que tienen certificados privados o autofirmados mediante Apache HttpClient y TrustStore global de.
Código de invocación de API prototípico mediante HttpClient
El siguiente código establece una conexión HTTPS con una API web:
...
String API_ENDPOINT = "https://example.com";
// Create HttpClientBuilder
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
// Create HttpClient
CloseableHttpClient httpClient = httpClientBuilder.build();
// Invoke API
CloseableHttpResponse closeableHttpResponse = httpClient.execute(new HttpGet(API_ENDPOINT));
// Code that reads response code and body from the 'closeableHttpResponse' object
...
El código usa las clases de biblioteca HttpClient de Apache HttpComponent y sus métodos.
AEM HttpClient y cargar material de TrustStore de la
AEM Para llamar a un extremo de API que tiene certificado privado o autofirmado, SSLContextBuilder
de HttpClient debe cargarse con TrustStore de y usarse para facilitar la conexión.
Siga estos pasos:
-
AEM Inicie sesión en Author como administrador.
-
AEM Vaya a Autor de > Herramientas > Seguridad > Almacén de confianza y abra el Almacén de confianza global. Si accede a la primera vez, establezca una contraseña para el Almacén de confianza global.
-
Para importar un certificado privado, haga clic en el botón Seleccionar archivo de certificado y seleccione el archivo de certificado deseado con la extensión
.cer
. Importarlo haciendo clic en el botón Enviar. -
Actualice el código Java™ como se muestra a continuación. AEM Tenga en cuenta que para usar
@Reference
para obtener el código de llamada deKeyStoreService
, el código de llamada debe ser un componente o servicio OSGi o un modelo Sling (y@OsgiService
se usa allí).code language-java ... // Get AEM's KeyStoreService reference @Reference private com.adobe.granite.keystore.KeyStoreService keyStoreService; ... // Get AEM TrustStore using KeyStoreService KeyStore aemTrustStore = getAEMTrustStore(keyStoreService, resourceResolver); if (aemTrustStore != null) { // Create SSL Context SSLContextBuilder sslbuilder = new SSLContextBuilder(); // Load AEM TrustStore material into above SSL Context sslbuilder.loadTrustMaterial(aemTrustStore, null); // Create SSL Connection Socket using above SSL Context SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( sslbuilder.build(), NoopHostnameVerifier.INSTANCE); // Create HttpClientBuilder HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); httpClientBuilder.setSSLSocketFactory(sslsf); // Create HttpClient CloseableHttpClient httpClient = httpClientBuilder.build(); // Invoke API closeableHttpResponse = httpClient.execute(new HttpGet(API_ENDPOINT)); // Code that reads response code and body from the 'closeableHttpResponse' object ... } /** * * Returns the global AEM TrustStore * * @param keyStoreService OOTB OSGi service that makes AEM based KeyStore * operations easy. * @param resourceResolver * @return */ private KeyStore getAEMTrustStore(KeyStoreService keyStoreService, ResourceResolver resourceResolver) { // get AEM TrustStore from the KeyStoreService and ResourceResolver KeyStore aemTrustStore = keyStoreService.getTrustStore(resourceResolver); return aemTrustStore; } ...
- Inserte el servicio OSGi OOTB
com.adobe.granite.keystore.KeyStoreService
en su componente OSGi. - AEM Obtenga el almacén de confianza global de la con
KeyStoreService
yResourceResolver
, el métodogetAEMTrustStore(...)
hace eso. - Cree un objeto de
SSLContextBuilder
, consulte Java™ Detalles de la API. - AEM Cargue el almacén de confianza global de la en
SSLContextBuilder
mediante el métodoloadTrustMaterial(KeyStore truststore,TrustStrategy trustStrategy)
. - AEM Pase
null
paraTrustStrategy
en el método anterior, se garantiza que solo los certificados de confianza se ejecuten correctamente durante la ejecución de la API.
- Inserte el servicio OSGi OOTB
Evitar cambios en el almacén de claves JVM
Un enfoque convencional para invocar de forma eficaz las API internas con certificados privados implica la modificación del repositorio de claves JVM. Se logra importando los certificados privados mediante el comando Java™ keytool.
AEM Sin embargo, este método no está alineado con las prácticas recomendadas de seguridad y ofrece una opción superior mediante la utilización del Almacén de confianza global y KeyStoreService.
Paquete de soluciones
El proyecto Node.js de muestra que se muestra en el vídeo se puede descargar desde aquí.
AEM El código de servlet de la está disponible en la rama tutorial/web-api-invocation
del proyecto WKND Sites, consulte.