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 에서 찾을 수 있습니다 .

Junit footer banner