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:

  1. Login aan de Auteur van AEM als beheerder.

  2. 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.

    Globale opslag van het Vertrouwen

  3. 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.

  4. Java™-code bijwerken zoals hieronder. Als u @Reference wilt gebruiken om AEM KeyStoreService 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 en ResourceResolver , de methode getAEMTrustStore(...) doet dat.
    • Creeer een voorwerp van SSLContextBuilder, zie Java™ ​ API details ​.
    • Laad de algemene AEM TrustStore in SSLContextBuilder met de methode loadTrustMaterial(KeyStore truststore,TrustStrategy trustStrategy) .
    • Geef null door voor TrustStrategy in de bovenstaande methode, zodat alleen de door AEM vertrouwde certificaten slagen tijdens de uitvoering van de API.
CAUTION
API-aanroepen met geldige certificaten die door CA zijn uitgegeven, mislukken wanneer ze worden uitgevoerd met de vermelde aanpak. Alleen API-aanroepen met vertrouwde AEM-certificaten zijn toegestaan wanneer deze methode wordt gevolgd.
Gebruik de ​ standaardbenadering ​ voor het uitvoeren van API vraag van geldige CA-Uitgegeven certificaten, betekenend dat slechts APIs verbonden aan privé certificaten gebruikend de eerder genoemde methode zou moeten worden uitgevoerd.

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

recommendation-more-help
c92bdb17-1e49-4e76-bcdd-89e4f85f45e6