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:

  1. AEM Inicie sesión en Author como administrador.

  2. 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.

    Almacén de confianza global

  3. 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.

  4. 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 de KeyStoreService, 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 y ResourceResolver, el método getAEMTrustStore(...) 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étodo loadTrustMaterial(KeyStore truststore,TrustStrategy trustStrategy).
    • AEM Pase null para TrustStrategy en el método anterior, se garantiza que solo los certificados de confianza se ejecuten correctamente durante la ejecución de la API.
CAUTION
Las llamadas a la API con certificados emitidos por la CA válidos fallan cuando se ejecutan con el método mencionado. AEM Solo las llamadas de API con certificados de confianza de la pueden realizarse correctamente al seguir este método.
Use el método estándar para ejecutar llamadas API de certificados emitidos por CA válidos, lo que significa que solo las API asociadas con certificados privados deben ejecutarse con el método mencionado anteriormente.

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.

recommendation-more-help
c92bdb17-1e49-4e76-bcdd-89e4f85f45e6