Chiamata delle API interne con certificati privati

Scopri come effettuare chiamate HTTPS da AEM alle API web utilizzando certificati privati o autofirmati.

Per impostazione predefinita, quando si tenta di stabilire una connessione HTTPS a un’API web che utilizza un certificato autofirmato, la connessione non riesce e viene visualizzato il messaggio di errore:

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Questo problema si verifica in genere quando il certificato SSL dell'API non viene rilasciato da un'autorità di certificazione (CA) riconosciuta e l'applicazione Java™ non è in grado di convalidare il certificato SSL/TLS.

Scopri come chiamare correttamente le API con certificati privati o autofirmati utilizzando Apache HttpClient e TrustStore globale dell'AEM.

Codice di chiamata API prototipo utilizzando HttpClient

Il codice seguente effettua una connessione HTTPS a un’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
...

Il codice utilizza le classi della libreria HttpClient di Apache HttpComponent e i relativi metodi.

HttpClient e caricare materiale AEM TrustStore

Per chiamare un endpoint API con certificato privato o autofirmato, il SSLContextBuilder di HttpClient deve essere caricato con TrustStore AEM e utilizzato per facilitare la connessione.

Segui i passaggi seguenti:

  1. Accedi a Autore AEM come amministratore.

  2. Passa a Autore AEM > Strumenti > Sicurezza > Archivio fonti attendibili e apri Archivio fonti attendibili globale. Se si accede per la prima volta, impostare una password per l'archivio fonti attendibili globale.

    Archivio attendibile globale

  3. Per importare un certificato privato, fare clic sul pulsante Seleziona file di certificato e selezionare il file di certificato desiderato con estensione .cer. Importa facendo clic sul pulsante Invia.

  4. Aggiorna il codice Java™ come segue. Per utilizzare @Reference per ottenere AEM che KeyStoreService, il codice chiamante deve essere un componente/servizio OSGi o un modello Sling (in cui è utilizzato @OsgiService).

    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;
    }
    
    ...
    
    • Inserisci il servizio OSGi com.adobe.granite.keystore.KeyStoreService OOTB nel componente OSGi.
    • Ottenere il TrustStore AEM globale utilizzando KeyStoreService e ResourceResolver. Questa operazione viene eseguita dal metodo getAEMTrustStore(...).
    • Creare un oggetto di SSLContextBuilder. Vedere Java™ Dettagli API.
    • Caricare il TrustStore AEM globale in SSLContextBuilder utilizzando il metodo loadTrustMaterial(KeyStore truststore,TrustStrategy trustStrategy).
    • Passa null per TrustStrategy nel metodo precedente, in modo da garantire che solo i certificati attendibili dell'AEM abbiano esito positivo durante l'esecuzione dell'API.
CAUTION
Le chiamate API con certificati validi emessi da una CA non riescono se eseguite utilizzando l’approccio indicato. Solo le chiamate API con certificati attendibili dell’AEM possono avere esito positivo quando si segue questo metodo.
Utilizza l'approccio standard per eseguire chiamate API di certificati validi emessi da CA, il che significa che solo le API associate a certificati privati devono essere eseguite utilizzando il metodo indicato in precedenza.

Evita le modifiche al keystore JVM

Un approccio convenzionale per richiamare in modo efficace le API interne con certificati privati comporta la modifica del keystore JVM. Ciò si ottiene importando i certificati privati mediante il comando Java™ keytool.

Tuttavia, questo metodo non è allineato con le best practice di sicurezza e AEM offre un'opzione superiore tramite l'utilizzo di Archivio attendibile globale e KeyStoreService.

Pacchetto soluzione

Il progetto Node.js di esempio demo nel video può essere scaricato da qui.

Il codice del servlet AEM è disponibile nel ramo tutorial/web-api-invocation del progetto WKND Sites, vedi.

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