Wederzijdse de authentificatie van de Veiligheid van de Laag van het Vervoer (mTLS) van AEM
Gemaakt voor:
- Ervaren
- Beheerder
- Ontwikkelaar
Leer hoe te om vraag HTTPS van AEM aan Web APIs te maken die de Wederzijdse authentificatie van de Veiligheid van de Laag van het Vervoer (mTLS) vereisen.

De mTLS of bidirectionele authentificatie van TLS verbetert de veiligheid van het protocol TLS door zowel de cliënt als de server te vereisen om elkaar voor authentiek te verklaren. Voor deze verificatie worden digitale certificaten gebruikt. Het wordt algemeen gebruikt in scenario's waar de sterke veiligheid en identiteitscontrole kritiek zijn.
Wanneer u probeert een HTTPS-verbinding te maken met een web-API waarvoor mTLS-verificatie is vereist, mislukt de verbinding standaard met de fout:
javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_required
Dit probleem doet zich voor wanneer de client geen certificaat voor verificatie presenteert.
Leer hoe te om APIs met succes te roepen die mTLS authentificatie door Apache HttpClienten vereist AEM KeyStore en TrustStore.
HttpClient en laden AEM KeyStore-materiaal
Op hoog niveau zijn de volgende stappen vereist om een met mTLS beveiligde API van AEM aan te roepen.
AEM genereren van certificaten
Vraag het AEM certificaat aan door samen te werken met het beveiligingsteam van uw organisatie. Het beveiligingsteam geeft of vraagt de certificaatgerelateerde details, zoals sleutel, CSR (Certificate signing Request) en het gebruik van CSR, als het certificaat is uitgegeven.
Voor demo-doeleinden genereert u de certificaatgerelateerde details, zoals sleutel, CSR (Certificate Signing Request). In het onderstaande voorbeeld wordt een zelfondertekende CA gebruikt om het certificaat uit te geven.
-
Eerst genereert u het certificaat van de interne certificeringsinstantie (CA).
# Create an internal Certification Authority (CA) certificate openssl req -new -x509 -days 9999 -keyout internal-ca-key.pem -out internal-ca-cert.pem
-
Genereer het AEM certificaat.
# Generate Key openssl genrsa -out client-key.pem # Generate CSR openssl req -new -key client-key.pem -out client-csr.pem # Generate certificate and sign with internal Certification Authority (CA) openssl x509 -req -days 9999 -in client-csr.pem -CA internal-ca-cert.pem -CAkey internal-ca-key.pem -CAcreateserial -out client-cert.pem # Verify certificate openssl verify -CAfile internal-ca-cert.pem client-cert.pem
-
Zet AEM persoonlijke sleutel in de indeling DER om, AEM KeyStore vereist de persoonlijke sleutel in de indeling DER.
openssl pkcs8 -topk8 -inform PEM -outform DER -in client-key.pem -out client-key.der -nocrypt
Certificaatuitwisseling
Als u een zelfondertekende CA voor het AEM certificaat gebruikt, zoals hierboven, verzendt u het certificaat of het certificaat van de interne certificeringsinstantie (CA) naar de API-provider.
Als de API-provider een zelfondertekend CA-certificaat gebruikt, ontvangt u het certificaat of het certificaat van de interne certificeringsinstantie (CA) van de API-provider.
Certificaat importeren
Voer de volgende stappen uit om AEM certificaat te importeren:
-
Login aan AEM Auteur als beheerder.
-
Navigeer aan AEM Auteur > Hulpmiddelen > Veiligheid > Gebruikers > creeer of selecteer een bestaande gebruiker.
Voor demo-doeleinden wordt een nieuwe gebruiker met de naam
mtl-demo-user
gemaakt. -
Om de Eigenschappen van de Gebruiker te openen, klik de gebruikersnaam.
-
Klik Keystore lusje en klik dan creëren Keystore knoop. Dan in de Vastgestelde dialoog van het Wachtwoord van de Toegang KeyStore, plaats een wachtwoord voor keystore van deze gebruiker en klik sparen.
-
In het nieuwe scherm, onder VOEG PRIVATE SLEUTEL VAN DER DOSSIER sectie TOE, volg de hieronder stappen:
-
Alias invoeren
-
Importeer de hierboven gegenereerde AEM Private Key in DER-indeling.
-
Importeer de bovenstaande certificaatkettingbestanden.
-
Klik op Verzenden
-
-
Controleer of het certificaat is geïmporteerd.
Als de API leverancier een zelf-ondertekend certificaat van CA gebruikt, voer het ontvangen certificaat in AEM TrustStore in, volg de stappen van hier.
En als AEM een zelfondertekend CA-certificaat gebruikt, vraagt u de API-provider om dit te importeren.
Prototypische mTLS API-aanroepcode met gebruik van HttpClient
Java™-code bijwerken zoals hieronder. Als u @Reference
-annotatie wilt gebruiken voor het ophalen van AEM KeyStoreService
-service, 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 KeyStore using KeyStoreService
KeyStore aemKeyStore = getAEMKeyStore(keyStoreService, resourceResolver);
if (aemKeyStore != null) {
// Create SSL Context
SSLContextBuilder sslbuilder = new SSLContextBuilder();
// Load AEM KeyStore material into above SSL Context with keystore password
// Ideally password should be encrypted and stored in OSGi config
sslbuilder.loadKeyMaterial(aemKeyStore, "admin".toCharArray());
// If API provider cert is self-signed, load AEM TrustStore material into above SSL Context
// Get AEM TrustStore
KeyStore aemTrustStore = getAEMTrustStore(keyStoreService, resourceResolver);
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(MTLS_API_ENDPOINT));
// Code that reads response code and body from the 'closeableHttpResponse' object
...
}
/**
* Returns the AEM KeyStore of a user. In this example we are using the
* 'mtl-demo-user' user.
*
* @param keyStoreService
* @param resourceResolver
* @return AEM KeyStore
*/
private KeyStore getAEMKeyStore(KeyStoreService keyStoreService, ResourceResolver resourceResolver) {
// get AEM KeyStore of 'mtl-demo-user' user, you can create a user or use an existing one.
// Then create keystore and upload key, certificate files.
KeyStore aemKeyStore = keyStoreService.getKeyStore(resourceResolver, "mtl-demo-user");
return aemKeyStore;
}
/**
*
* 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 AEM KeyStore van de gebruiker op met
KeyStoreService
enResourceResolver
, de methodegetAEMKeyStore(...)
doet dat. - Als de API-provider een zelfondertekend CA-certificaat gebruikt, krijgt de algemene AEM TrustStore, doet de methode
getAEMTrustStore(...)
dat. - Creeer een voorwerp van
SSLContextBuilder
, zie Java™ API details. - Laad de AEM KeyStore van de gebruiker in
SSLContextBuilder
gebruikendloadKeyMaterial(final KeyStore keystore,final char[] keyPassword)
methode. - Het keystore wachtwoord is het wachtwoord dat toen het creëren van keystore werd geplaatst, zou het in OSGi config moeten worden opgeslagen, zie {de Waarden van de Configuratie 0} Geheime 🔗.
Wijzigingen in JVM-sleutelarchief vermijden
Een conventionele benadering om mTLS 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 User-specific KeyStores en Global TrustStore 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