Saiba como fazer chamadas HTTPS do AEM para APIs da Web usando certificados privados ou autoassinados.
Por padrão, ao tentar fazer uma conexão HTTPS com uma API da Web que usa um certificado autoassinado, a conexão falha com o erro:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Normalmente, esse problema ocorre quando a variável O certificado SSL da API não é emitido por uma autoridade de certificação reconhecida O e o aplicativo Java™ não podem validar o certificado SSL/TLS.
Saiba como chamar com êxito APIs com certificados privados ou autoassinados usando Apache HttpClient e AEM global TrustStore.
O código a seguir faz uma conexão HTTPS com uma API da 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
...
O código usa o Apache HttpComponentdo HttpClient classes de biblioteca e seus métodos.
Para chamar um endpoint de API que tenha certificado privado ou autoassinado, o HttpClientdo SSLContextBuilder
deve ser carregado com AEM TrustStore e usado para facilitar a conexão.
Siga as etapas abaixo:
Fazer logon em Autor do AEM como um administrador.
Navegue até Autor do AEM > Ferramentas > Segurança > Armazenamento de confiança e abra a variável Armazenamento global de confiança. Se estiver acessando pela primeira vez, defina uma senha para o Armazenamento global de confiança.
Para importar um certificado privado, clique em Selecionar arquivo de certificado e selecione o arquivo de certificado desejado com .cer
extensão. Importe clicando em Enviar botão.
Atualize o código Java™ conforme abaixo. Observe que para usar @Reference
para obter AEM KeyStoreService
o código de chamada deve ser um componente/serviço OSGi ou um Modelo Sling (e @OsgiService
é usado lá).
...
// 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;
}
...
com.adobe.granite.keystore.KeyStoreService
Serviço OSGi no componente OSGi.KeyStoreService
e ResourceResolver
, o getAEMTrustStore(...)
faz isso.SSLContextBuilder
, consulte Java™ Detalhes da API.SSLContextBuilder
usar loadTrustMaterial(KeyStore truststore,TrustStrategy trustStrategy)
método.null
para TrustStrategy
no método acima, ele garante que somente certificados confiáveis de AEM sejam bem-sucedidos durante a execução da API.As chamadas de API com certificados válidos emitidos pela CA falham quando executadas usando a abordagem mencionada. Somente chamadas de API com certificados confiáveis AEM podem ter êxito ao seguir esse método.
Use o método padrão para executar chamadas de API de certificados válidos emitidos por CA, o que significa que somente APIs associadas a certificados privados devem ser executadas usando o método mencionado anteriormente.
Uma abordagem convencional para chamar efetivamente APIs internas com certificados privados envolve a modificação da JVM Keystore. Isso é feito importando os certificados privados usando o Java™ keytool comando.
No entanto, esse método não está alinhado às práticas recomendadas de segurança e o AEM oferece uma opção superior por meio da utilização do Armazenamento global de confiança e KeyStoreService.
O projeto Node.js de amostra demoed no vídeo pode ser baixado em aqui.
O código do servlet AEM está disponível no site do projeto WKND tutorial/web-api-invocation
filial, consulte.