Chiamata delle API interne con certificati privati

Ultimo aggiornamento: 2023-11-30
  • Argomenti:
  • Security
    Visualizza ulteriori informazioni su questo argomento
  • Creato per:
  • Experienced
    Admin
    Developer

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 è rilasciato da un’autorità di certificazione (CA) riconosciuta e Java™ non possono convalidare il certificato SSL/TLS.

Scopri come chiamare correttamente le API che dispongono di certificati privati o autofirmati utilizzando Apache HttpClient e TrustStore globale 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 Apache HttpComponentdi HttpClient classi di libreria e relativi metodi.

HttpClient e caricare materiale AEM TrustStore

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

Segui i passaggi seguenti:

  1. Accedi a Autore AEM come amministratore.

  2. Accedi a Autore AEM > Strumenti > Sicurezza > Archivio fonti attendibili e aprire Archivio attendibile 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, fai clic su Seleziona file di certificato e seleziona il file di certificato desiderato con .cer estensione. Importa facendo clic su Invia pulsante.

  4. Aggiorna il codice Java™ come segue. Da utilizzare @Reference per contrarre l'AEM KeyStoreService il codice chiamante deve essere un componente/servizio OSGi o un modello Sling (e @OsgiService viene utilizzato).

    ...
    
    // 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;
    }
    
    ...
    
    • Iniettare la soluzione iniettabile com.adobe.granite.keystore.KeyStoreService Il servizio OSGi nel componente OSGi.
    • Ottieni il TrustStore AEM globale tramite KeyStoreService e ResourceResolver, il getAEMTrustStore(...) il metodo lo fa.
    • Crea un oggetto di SSLContextBuilder, consulta Java™ Dettagli API.
    • Carica il TrustStore AEM globale in SSLContextBuilder utilizzo loadTrustMaterial(KeyStore truststore,TrustStrategy trustStrategy) metodo.
    • Superato null per TrustStrategy nel metodo precedente, garantisce che solo i certificati attendibili dell’AEM abbiano esito positivo durante l’esecuzione dell’API.
ATTENZIONE

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 il approccio standard per l’esecuzione di chiamate API di certificati validi emessi da una CA, il che significa che solo le API associate a certificati privati devono essere eseguite utilizzando il metodo precedentemente indicato.

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 utilizzando Java™ keytool comando.

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

Pacchetto soluzione

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

Il codice servlet dell’AEM è disponibile nel documento WKND Sites Project tutorial/web-api-invocation filiale, vedi.

In questa pagina