Interne API's met persoonlijke certificaten aanroepen
Leer hoe u HTTPS-aanroepen vanuit AEM naar web-API's kunt maken met behulp van persoonlijke of zelfondertekende certificaten.
Wanneer u probeert een HTTPS-verbinding te maken met een web-API die een zelfondertekend certificaat gebruikt, mislukt de verbinding standaard met de fout:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Deze kwestie komt typisch voor wanneer het SSL van API certificaat niet door een erkende certificaatgezag (CA) wordt uitgegeven en de toepassing Java™ kan SSL/TLS certificaat niet bevestigen.
Leer hoe te met succes APIs roepen die privé of zelf-ondertekende certificaten door Apache HttpClient en AEM globale TrustStore te gebruiken hebben.
Prototypische API-aanroepcode met gebruik van HttpClient
De volgende code maakt een HTTPS-verbinding met een web-API:
...
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
...
De code gebruikt Apache HttpComponent HttpClient bibliotheekklassen en hun methodes.
HttpClient en laad AEM TrustStore-materiaal
Om een API eindpunt te roepen dat privé of zelf-ondertekend certificaat heeft, HttpClient SSLContextBuilder
moet met AEM TrustStore worden geladen, en worden gebruikt om de verbinding te vergemakkelijken.
Voer de volgende stappen uit:
-
Login aan de Auteur van AEM als beheerder.
-
Navigeer aan de Auteur van AEM > Hulpmiddelen > Veiligheid > de Opslag van het Vertrouwen, en open de Globale Opslag van het Vertrouwen. Als u voor het eerst een account opent, stelt u een wachtwoord in voor de Global Trust Store.
-
Om een privé certificaat in te voeren, klik Uitgezochte de knoop van het Dossier van het Certificaat en selecteer gewenst certificaatdossier met
.cer
uitbreiding. Importeer het door te klikken op Verzenden knop. -
Java™-code bijwerken zoals hieronder. Als u
@Reference
wilt gebruiken om AEMKeyStoreService
op te halen, moet de aanroepende code een OSGi-component/service zijn of een Sling Model (en wordt@OsgiService
daar gebruikt).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; } ...
- Injecteer de OOTB
com.adobe.granite.keystore.KeyStoreService
OSGi-service in uw OSGi-component. - Haal de algemene AEM TrustStore op met
KeyStoreService
enResourceResolver
, de methodegetAEMTrustStore(...)
doet dat. - Creeer een voorwerp van
SSLContextBuilder
, zie Java™ API details . - Laad de algemene AEM TrustStore in
SSLContextBuilder
met de methodeloadTrustMaterial(KeyStore truststore,TrustStrategy trustStrategy)
. - Geef
null
door voorTrustStrategy
in de bovenstaande methode, zodat alleen de door AEM vertrouwde certificaten slagen tijdens de uitvoering van de API.
- Injecteer de OOTB
Wijzigingen in JVM-sleutelarchief vermijden
Een conventionele benadering om interne APIs met privé certificaten effectief aan te halen impliceert het wijzigen van JVM Keystore. Het wordt bereikt door de privé certificaten in te voeren gebruikend het Java™ keytool bevel.
Nochtans, wordt deze methode niet gericht op veiligheid beste praktijken en AEM biedt een superieure optie door het gebruik van de Globale opslag van het Vertrouwen en KeyStoreService aan.
Oplossingspakket
Het steekproefproject Node.js dat in de video wordt gedemoed kan van hier worden gedownload.
De servletcode van AEM is beschikbaar in de 0} tak van het Project van Plaatsen WKND {, zie .tutorial/web-api-invocation