Interne API's met persoonlijke certificaten aanroepen
Gemaakt voor:
- Ervaren
- Beheerder
- Ontwikkelaar
Leer hoe te om vraag HTTPS van AEM aan Web APIs te maken gebruikend privé of zelf-ondertekende 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 HttpClienten 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 HttpComponentHttpClientbibliotheekklassen en hun methodes.
HttpClient en load AEM TrustStore-materiaal
Om een API eindpunt te roepen dat privé of zelf-ondertekend certificaat heeft, moet HttpClientSSLContextBuilder
met AEM TrustStore worden geladen, en worden gebruikt om de verbinding te vergemakkelijken.
Voer de volgende stappen uit:
-
Login aan AEM Auteur als beheerder.
-
Navigeer aan AEM Auteur > 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 omKeyStoreService
AEM te krijgen, moet de aanroepende code een OSGi-component/service zijn of een Sling Model (en wordt@OsgiService
daar gebruikt).... // 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 globale AEM TrustStore in
SSLContextBuilder
gebruikendloadTrustMaterial(KeyStore truststore,TrustStrategy trustStrategy)
methode. - Als u
null
doorgeeft voorTrustStrategy
in de bovenstaande methode, zorgt deze ervoor dat alleen AEM vertrouwde certificaten slagen tijdens het uitvoeren 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™ keytoolbevel.
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 KeyStoreServiceaan.
Oplossingspakket
Het steekproefproject Node.js dat in de video wordt gedemoed kan van hierworden gedownload.
De AEM servlet code is beschikbaar in de 0} tak van het Project van Plaatsen WKND {, zie.tutorial/web-api-invocation