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.
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.
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:
Accedi a Autore AEM come amministratore.
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.
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.
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;
}
...
com.adobe.granite.keystore.KeyStoreService
Il servizio OSGi nel componente OSGi.KeyStoreService
e ResourceResolver
, il getAEMTrustStore(...)
il metodo lo fa.SSLContextBuilder
, consulta Java™ Dettagli API.SSLContextBuilder
utilizzo loadTrustMaterial(KeyStore truststore,TrustStrategy trustStrategy)
metodo.null
per TrustStrategy
nel metodo precedente, garantisce che solo i certificati attendibili dell’AEM abbiano esito positivo durante l’esecuzione dell’API.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.
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.
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.