Chamar APIs internas com certificados privados
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 o certificado SSL da API não é emitido por uma autoridade de certificação reconhecida (CA) e o aplicativo Java™ não pode validar o certificado SSL/TLS.
Saiba como chamar com êxito APIs com certificados privados ou autoassinados usando o Apache HttpClient e o AEM TrustStore global.
Código de invocação de API de protótipo usando HttpClient
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 as classes de biblioteca HttpClient do Apache HttpComponent e seus métodos.
HttpClient e carregar material AEM TrustStore
Para chamar um ponto de extremidade de API que tenha certificado privado ou autoassinado, o SSLContextBuilder
do HttpClient deve ser carregado com TrustStore do AEM e usado para facilitar a conexão.
Siga as etapas abaixo:
-
Faça logon no AEM Author como administrador.
-
Navegue até AEM Author > Tools > Security > Trust Store e abra o Global Trust Store. Se estiver acessando pela primeira vez, defina uma senha para o Armazenamento global de confiança.
-
Para importar um certificado privado, clique no botão Selecionar Arquivo de Certificado e selecione o arquivo de certificado desejado com a extensão
.cer
. Importe clicando no botão Enviar. -
Atualize o código Java™ conforme abaixo. Observe que para usar
@Reference
para obter AEMKeyStoreService
, o código de chamada deve ser um componente/serviço OSGi ou um Modelo Sling (e@OsgiService
é usado lá).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; } ...
- Insira o serviço OSGi
com.adobe.granite.keystore.KeyStoreService
do OOTB no componente OSGi. - Obtenha o AEM TrustStore global usando
KeyStoreService
eResourceResolver
, o métodogetAEMTrustStore(...)
faz isso. - Crie um objeto de
SSLContextBuilder
, consulte Detalhes da API do Java™. - Carregue o AEM TrustStore global em
SSLContextBuilder
usando o métodoloadTrustMaterial(KeyStore truststore,TrustStrategy trustStrategy)
. - Passe
null
paraTrustStrategy
no método acima. Isso garante que somente certificados confiáveis de AEM sejam bem-sucedidos durante a execução da API.
- Insira o serviço OSGi
Evite alterações no JVM Keystore
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 comando Java™ keytool.
No entanto, este método não está alinhado com as 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 do KeyStoreService.
Pacote de soluções
O projeto Node.js de amostra rebaixado no vídeo pode ser baixado de aqui.
O código do servlet AEM está disponível na ramificação tutorial/web-api-invocation
do Projeto do Sites WKND, consulte.