1. 개요
이 빠른 사용방법(예제)에서는 빠르고 실용적인 예제를 통해 Java에서 신뢰할 수 있는 인증서 List을 읽는 방법을 배웁니다.
2. 키 저장소 로드
Java는 Java 설치 폴더 안에 있는 cacerts 라는 특수 파일에 신뢰할 수 있는 인증서를 저장 합니다.
이 파일을 읽고 KeyStore에 로드하여 시작하겠습니다 .
private KeyStore loadKeyStore() {
String relativeCacertsPath = "/lib/security/cacerts".replace("/", File.separator);
String filename = System.getProperty("java.home") + relativeCacertsPath;
FileInputStream is = new FileInputStream(filename);
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
String password = "changeit";
keystore.load(is, password.toCharArray());
return keystore;
}
이 KeyStore 의 기본 암호 는 "changeit" 이지만 이전에 시스템에서 변경된 경우 다를 수 있습니다.
로드되면 KeyStore 는 신뢰할 수 있는 인증서를 보유하고 다음으로 이를 읽는 방법을 살펴보겠습니다.
3. 지정된 키 저장소 에서 인증서 읽기
KeyStore 를 생성자 매개변수 로 사용하는 PKIXParameters 클래스 를 사용할 것입니다 .
@Test
public void whenLoadingCacertsKeyStore_thenCertificatesArePresent() {
KeyStore keyStore = loadKeyStore();
PKIXParameters params = new PKIXParameters(keyStore);
Set<TrustAnchor> trustAnchors = params.getTrustAnchors();
List<Certificate> certificates = trustAnchors.stream()
.map(TrustAnchor::getTrustedCert)
.collect(Collectors.toList());
assertFalse(certificates.isEmpty());
}
및 PKIXParameters의 클래스는 일반적으로 인증서의 유효성을 확인하는 데 사용되지만 우리의 예에서 우리는 단순히 우리의에서 인증서를 정확한하는 데 사용되는 키 스토어 .
PKIXParametrs 의 인스턴스를 만들 때 KeyStore 에 있는 신뢰할 수 있는 인증서를 포함할 TrustAnchor List을 만듭니다 .
있는 TrustAnchor의 인스턴스는 단순히 신뢰할 수있는 인증서를 나타냅니다.
4. 기본 키 저장소 에서 인증서 읽기
또한 TrustManagerFactory 클래스 를 사용하고 기본 KeyStore를 사용 하는 KeyStore 없이 초기화 하여 시스템에 있는 신뢰할 수 있는 인증서 List을 얻을 수 있습니다 .
KeyStore를 명시적으로 제공하지 않으면 기본적으로 이전 장의 동일한 키 저장소 가 사용됩니다.
@Test
public void whenLoadingDefaultKeyStore_thenCertificatesArePresent() {
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore) null);
List<TrustManager> trustManagers = Arrays.asList(trustManagerFactory.getTrustManagers());
List<X509Certificate> certificates = trustManagers.stream()
.filter(X509TrustManager.class::isInstance)
.map(X509TrustManager.class::cast)
.map(trustManager -> Arrays.asList(trustManager.getAcceptedIssuers()))
.flatMap(Collection::stream)
.collect(Collectors.toList());
assertFalse(certificates.isEmpty());
}
위의 예에서는 SSL 연결의 원격 부분 을 인증하는 데 사용되는 특수 TrustManager인 X509TrustManager를 사용했습니다 .
사양 이 init() KeyStore 매개변수가 null 인 경우 발생해야 하는 일을 정의하지 않기 때문에 이 동작은 특정 JDK 구현에 따라 달라질 수 있습니다 .
5. 인증서 별칭
인증서 별칭은 인증서 를 고유하게 식별하는 단순히 문자열 입니다.
Java에서 가져온 기본 인증서 중에는 공개 인터넷 도메인 등록 기관인 GoDaddy에서 발급한 잘 알려진 인증서도 있습니다. 이 인증서를 테스트에 사용할 것입니다.
String GODADDY_CA_ALIAS = "godaddyrootg2ca [jdk]";
KeyStore에 있는 모든 인증서 별칭을 읽는 방법을 살펴보겠습니다 .
@Test
public void whenLoadingKeyStore_thenGoDaddyCALabelIsPresent() {
KeyStore keyStore = loadKeyStore();
Enumeration<String> aliasEnumeration = keyStore.aliases();
List<String> aliases = Collections.list(aliasEnumeration);
assertTrue(aliases.contains(GODADDY_CA_ALIAS));
}
다음 예에서는 별칭으로 인증서를 검색하는 방법을 살펴보겠습니다.
@Test
public void whenLoadingKeyStore_thenGoDaddyCertificateIsPresent() {
KeyStore keyStore = loadKeyStore();
Certificate goDaddyCertificate = keyStore.getCertificate(GODADDY_CA_ALIAS);
assertNotNull(goDaddyCertificate);
}
6. 결론
이 빠른 기사에서는 빠르고 실용적인 예제를 통해 Java에서 신뢰할 수 있는 인증서를 나열하는 다양한 방법을 살펴보았습니다.
항상 그렇듯이 코드 조각은 GitHub 에서 찾을 수 있습니다 .