적용 대상: Azure Database for PostgreSQL - 유연한 서버
인증서 고정 시나리오를 위해 클라이언트의 Java 키 저장소에서 루트 CA 인증서 가져오기
사용자 지정으로 작성된 Java 애플리케이션은 신뢰할 수 있는 CA(인증 기관) 인증서를 포함하는 기본 키 저장소를 cacerts
사용합니다. Java 신뢰 저장소라고도 합니다. 이름이 지정된 cacerts
인증서 파일은 보안 속성 디렉터리인 java.home\lib\security에 있습니다. 여기서 java.home은 런타임 환경 디렉터리( jre
SDK의 디렉터리 또는 Java™ 2 런타임 환경의 최상위 디렉터리)입니다.
PostgreSQL 유연한 서버를 사용하여 클라이언트 인증서 고정 시나리오에 대한 클라이언트 루트 CA 인증서를 업데이트하려면 다음 지침을 사용할 수 있습니다.
- Java 키 저장소에 필요한 인증서가 이미 포함되어 있는지 확인
cacerts
합니다. 다음 명령을 사용하여 Java 키 저장소에 인증서를 나열할 수 있습니다.
keytool -list -v -keystore ..\lib\security\cacerts > outputfile.txt
출력에서 확인할 수 있듯이 클라이언트의 Java 키 저장소에 필요한 인증서가 없는 경우 다음 지침을 따라야 합니다.
사용자 지정 키 저장소의 백업 복사본을 만듭니다.
인증서를 다운로드하고 참조할 수 있는 위치에 로컬로 저장합니다.
필요한 모든 루트 CA 인증서가 모두 포함된 결합된 CA 인증서 저장소를 생성합니다. 아래 예제에서는 PostgreSQL JDBC 사용자에게 DefaultJavaSSLFactory를 사용하는 방법을 보여줍니다.
keytool -importcert -alias PostgreSQLServerCACert -file D:\ DigiCertGlobalRootG2.crt.pem -keystore truststore -storepass password -noprompt keytool -importcert -alias PostgreSQLServerCACert2 -file "D:\ Microsoft ECC Root Certificate Authority 2017.crt.pem" -keystore truststore -storepass password -noprompt keytool -importcert -alias PostgreSQLServerCACert -file D:\ DigiCertGlobalRootCA.crt.pem -keystore truststore -storepass password -noprompt
원래 키 저장소 파일을 새로 생성된 파일로 바꿉니다.
System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file"); System.setProperty("javax.net.ssl.trustStorePassword","password");
원래 루트 CA pem 파일을 결합된 루트 CA 파일로 바꾸고, 응용 프로그램/클라이언트를 다시 시작합니다.
PostgreSQL JDBC 드라이버를 사용하여 클라이언트 인증서를 구성하는 방법에 대한 자세한 내용은 이 설명서를 참조하세요.
참고
인증서를 클라이언트 인증서 저장소로 가져오려면 인증서 .crt 파일을 .pem 형식으로 변환해야 할 수 있습니다. OpenSSL 유틸리티를 사용하여 이러한 파일 변환을 수행할 수 있습니다.
Java 키 저장소에서 프로그래밍 방식으로 신뢰할 수 있는 인증서 목록 가져오기
기본적으로 Java는 클라이언트의 Java 설치 폴더 내에 있는 특수 cacerts
파일에 신뢰할 수 있는 인증서를 저장합니다.
아래 예제에서는 먼저 KeyStore 개체를 읽고 cacerts
로드합니다.
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;
}
기본 암호 cacerts
는 changeit
이나, 실제 사용자 환경에서는 다르게 설정되어야 합니다. 관리자는 Java 설치 후 즉시 암호를 변경할 것을 권장합니다.
KeyStore 개체를 로드한 후에는 PKIXParameters 클래스를 사용하여 존재하는 인증서를 읽을 수 있습니다.
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());
}
인증서 고정 시나리오를 위해 Azure App Services에서 클라이언트를 사용할 때 루트 CA 인증서 업데이트
Azure App Services의 경우 Azure Database for PostgreSQL 유연한 서버에 연결하는 경우 클라이언트 인증서를 업데이트하는 두 가지 시나리오를 사용할 수 있으며 Azure App Services에 배포된 애플리케이션에서 SSL을 사용하는 방법에 따라 달라집니다.
- Azure Database for PostgreSQL 유연한 서버에서 변경이 발생하기 전에 플랫폼 수준에서 App Service에 새 인증서가 추가됩니다. 애플리케이션의 App Service 플랫폼에 포함된 SSL 인증서를 사용하는 경우 아무 작업도 필요하지 않습니다. 자세한 내용은 Azure App Service 설명서의 Azure App Service에서 TLS/SSL 인증서 추가 및 관리를 참조하세요.
- 코드에 SSL 인증서 파일의 경로를 명시적으로 포함하는 경우 새 인증서를 다운로드하고 사용할 코드를 업데이트해야 합니다. 이 시나리오의 좋은 예는 Azure App Service 문서의 자습서: Azure App Service에서 사용자 지정 컨테이너에 대한 사이드카 컨테이너 구성에 설명된 대로 App Service에서 사용자 지정 컨테이너를 사용하는 경우입니다.
인증서 고정 시나리오를 위해 AKS(Azure Kubernetes Service)에서 클라이언트를 사용할 때 루트 CA 인증서 업데이트
AKS(Azure Kubernetes Services)에서 호스트되는 애플리케이션을 사용하여 Azure Database for PostgreSQL에 연결하고 인증서를 고정하려는 경우 전용 고객의 호스트 환경에서 액세스하는 것과 비슷합니다. 여기의 단계를 참조하세요.
인증서 고정 시나리오를 위해 Windows에서 .NET(Npgsql) 사용자에 대한 루트 CA 인증서 업데이트
Windows의 .NET(Npgsql) 사용자의 경우 Azure Database for PostgreSQL 유연한 서버에 연결하려면 세 가지 Microsoft RSA 루트 인증 기관 2017, DigiCert Global Root G2 및 Digicert Global Root CA가 모두 Windows 인증서 저장소, 신뢰할 수 있는 루트 인증 기관에 있는지 확인합니다. 인증서가 없는 경우, 누락된 인증서를 가져옵니다.
인증서 고정 시나리오를 위해 다른 클라이언트에 대한 루트 CA 인증서 업데이트
다른 PostgreSQL 클라이언트 사용자의 경우 다음 형식을 사용하여 두 개의 CA 인증서 파일을 병합할 수 있습니다.
-----BEGIN CERTIFICATE-----
(Root CA1: DigiCertGlobalRootCA.crt.pem)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(Root CA2: Microsoft ECC Root Certificate Authority 2017.crt.pem)
-----END CERTIFICATE-----