개인 인증서가 있는 내부 API 호출
개인 또는 자체 서명된 인증서를 사용하여 AEM에서 웹 API로 HTTPS를 호출하는 방법에 대해 알아봅니다.
자체 서명된 인증서를 사용하는 웹 API에 HTTPS 연결을 만들려고 하면 기본적으로 다음 오류로 연결이 실패합니다.
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
이 문제는 일반적으로 API의 SSL 인증서가 인증된 CA(인증 기관)에 의해 발급되지 않고 Java™ 응용 프로그램이 SSL/TLS 인증서의 유효성을 검사할 수 없을 때 발생합니다.
Apache HttpClient 및 AEM의 글로벌 TrustStore 를 사용하여 개인 또는 자체 서명된 인증서가 있는 API를 성공적으로 호출하는 방법에 대해 알아보겠습니다.
HttpClient를 사용하는 프로토타입 API 호출 코드
다음 코드는 웹 API에 HTTPS 연결을 만듭니다.
...
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
...
이 코드는 Apache HttpComponent의 HttpClient 라이브러리 클래스와 해당 메서드를 사용합니다.
HttpClient 및 AEM TrustStore 자료 로드
개인 인증서 또는 자체 서명된 인증서 가 있는 API 끝점을 호출하려면 HttpClient의 SSLContextBuilder
을(를) AEM의 TrustStore와 함께 로드하고 연결을 용이하게 하는 데 사용해야 합니다.
아래 단계를 수행합니다.
-
관리자(으)로 AEM 작성자 에 로그인합니다.
-
AEM 작성자 > 도구 > 보안 > Trust Store(으)로 이동하여 글로벌 Trust Store 를 엽니다. 처음 액세스하는 경우 글로벌 Trust Store에 대한 암호를 설정합니다.
-
개인 인증서를 가져오려면 인증서 파일 선택 단추를 클릭하고 확장명이
.cer
인 원하는 인증서 파일을 선택하십시오. 제출 단추를 클릭하여 가져옵니다. -
아래와 같이 Java™ 코드를 업데이트합니다.
@Reference
을(를) 사용하여 AEM의KeyStoreService
을(를) 가져오려면 호출 코드가 OSGi 구성 요소/서비스이거나 Sling 모델이어야 합니다(여기에서@OsgiService
이(가) 사용됨).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; } ...
- OSGi 구성 요소에 OOTB
com.adobe.granite.keystore.KeyStoreService
OSGi 서비스를 삽입합니다. KeyStoreService
및ResourceResolver
을(를) 사용하여 글로벌 AEM TrustStore를 가져오면getAEMTrustStore(...)
메서드가 이를 수행합니다.SSLContextBuilder
의 개체를 만듭니다. Java™ API 세부 정보를 참조하십시오.loadTrustMaterial(KeyStore truststore,TrustStrategy trustStrategy)
메서드를 사용하여SSLContextBuilder
에 전역 AEM TrustStore를 로드합니다.- 위의 메서드에서
TrustStrategy
에 대해null
을(를) 전달하면 API 실행 중에 AEM 신뢰할 수 있는 인증서만 성공하게 됩니다.
- OSGi 구성 요소에 OOTB
JVM 키 저장소 변경 방지
개인 인증서로 내부 API를 효과적으로 호출하는 기존 접근 방법에는 JVM 키 저장소 수정이 포함됩니다. Java™ keytool 명령을 사용하여 개인 인증서를 가져오면 됩니다.
그러나 이 방법은 보안 모범 사례와 일치하지 않으며 AEM은 Global Trust Store 및 KeyStoreService을(를) 활용하여 더 나은 옵션을 제공합니다.
솔루션 패키지
비디오에서 데모된 샘플 Node.js 프로젝트는 여기에서 다운로드할 수 있습니다.
AEM 서블릿 코드는 WKND Sites 프로젝트의 tutorial/web-api-invocation
분기 see에서 사용할 수 있습니다.