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:
-
Accedi a Autore AEM come amministratore.
-
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.
-
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. -
Aggiorna il codice Java™ come segue. Per utilizzare
@Reference
per ottenere AEM cheKeyStoreService
, 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
eResourceResolver
. Questa operazione viene eseguita dal metodogetAEMTrustStore(...)
. - Creare un oggetto di
SSLContextBuilder
. Vedere Java™ Dettagli API. - Caricare il TrustStore AEM globale in
SSLContextBuilder
utilizzando il metodoloadTrustMaterial(KeyStore truststore,TrustStrategy trustStrategy)
. - Passa
null
perTrustStrategy
nel metodo precedente, in modo da garantire che solo i certificati attendibili dell'AEM abbiano esito positivo durante l'esecuzione dell'API.
- Inserisci il servizio OSGi
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.