Docs Menu
Docs Home
/ / /
Java 동기화
/ /

연결에서 TLS/SSL 활성화

이 페이지의 내용

  • 개요
  • TLS/SSL 활성화
  • 인증서 구성
  • JVM 보안 저장소 구성
  • JVM 키 저장소 구성
  • 클라이언트별 신뢰 저장소 및 키 저장소 구성
  • 호스트 이름 확인 사용 안 함
  • 연결 시 TLS 1.2 전용으로 제한하기
  • Java SE SSLContext를 통한 TLS/SSL 구성 사용자 지정
  • Netty SslContext를 통한 TLS/SSL 구성 사용자 지정
  • 온라인 인증서 상태 프로토콜(OCSP)
  • 클라이언트 중심 OCSP
  • OCSP 스테이플링

이 가이드에서는 JDK의 기본 TLS/SSL 지원을 사용하여 TLS/SSL 보안 프로토콜로 MongoDB 인스턴스에 연결하는 방법을 학습할 수 있습니다. TLS/SSL을 사용하도록 연결을 구성하려면 ConnectionString 또는 MongoClientSettings에서 TLS/SSL 설정을 사용하도록 설정합니다.

참고

TLS/SSL 디버깅

TLS/SSL 연결을 설정하는 데 문제가 있는 경우 -Djavax.net.debug=all 시스템 속성을 사용하여 더 많은 로그 문을 볼 수 있습니다. 자세한 내용은 TLS/SSL 연결 디버깅에 대한 Oracle 가이드를 참조하세요.

연결 문자열의 매개변수를 사용하거나 MongoClientSettings.Builder 클래스의 메서드를 사용하는 두 가지 방법으로 MongoDB 인스턴스에 연결하기 위해 TLS/SSL을 활성화할 수 있습니다.

참고

연결 문자열의 mongodb+srv 접두사로 표시된 DNS 시드 목록 프로토콜을 사용하여 연결하는 경우 드라이버가 TLS/SSL을 허용합니다. 허용하지 않으려면 연결 문자열 또는 MongoClientSettings 인스턴스에서 tls 또는 ssl 매개 변수 값을 false(으)로 설정합니다.

DNS 시드 목록을 사용할 때의 연결 동작에 대한 자세한 내용은 서버 매뉴얼의 SRV 연결 형식 섹션을 참조하세요.

ConnectionString 이 있는 string tls true 연결에서 TLS/SSL을 활성화 하려면 에 전달된 연결 string 에서 연결 매개변수 에 값을 할당합니다.MongoClients.create()

MongoClient mongoClient = MongoClients.create("mongodb+srv://<db_username>:<db_password>@<cluster-url>?tls=true");

MongoClientSettings.Builder 클래스를 사용하여 MongoClient의 TLS/SSL 연결 옵션을 구성하려면 applyToSslSettings() 메서드를 호출합니다. SslSettings.Builder 차단에서 enabled 속성을 true로 설정하여 TLS/SSL을 활성화 합니다.

MongoClientSettings settings = MongoClientSettings.builder()
.applyToSslSettings(builder ->
builder.enabled(true))
.build();
MongoClient client = MongoClients.create(settings);

TLS/SSL 요청을 시작하는 Java 애플리케이션에는 애플리케이션 자체 및 애플리케이션과 상호 작용하는 다른 애플리케이션의 ID를 증명하는 암호화 인증서에 대한 액세스가 필요합니다. 다음 메커니즘을 사용하여 애플리케이션에서 이러한 인증서에 대한 액세스를 구성할 수 있습니다.

  • JVM 신뢰 저장소 및 JVM 키 저장소

  • 클라이언트별 신뢰 저장소 및 키 저장소

참고

다음 섹션은 Oracle JDK 설명서를 기반으로 하므로 일부 부분이 JDK 또는 사용 중인 사용자 지정 TLS/SSL 구현에 적용되지 않을 수 있습니다.

참고

기본적으로 JRE에는 Let's Encrypt와 같은 서명 기관에서 일반적으로 사용하는 많은 공개 인증서가 포함되어 있습니다. 따라서 신뢰 저장소를 구성하지 않고도 TLS/SSL을 사용하여 MongoDB Atlas(또는 JRE의 기본 인증서 저장소에 있는 기관에서 서명한 인증서를 보유한 다른 서버)의 인스턴스에 연결할 수 있습니다.

JVM 보안 저장소는 Java 애플리케이션이 상호 작용하는 다른 애플리케이션을 안전하게 식별하는 인증서를 저장합니다. 이러한 인증서를 사용하면 사용자의 애플리케이션은 다른 애플리케이션에 대한 연결이 진짜이고 제3자의 변조로부터 안전하다는 것을 증명할 수 있습니다.

MongoDB 인스턴스가 JRE의 기본 인증서 저장소에 없는 기관에서 서명한 인증서를 사용하는 경우 애플리케이션은 SSL/TLS 요청을 개시하기 위해 두 개의 시스템 속성을 구성해야 합니다. 이러한 속성은 연결된 MongoDB 인스턴스에서 제공하는 TLS/SSL 인증서의 유효성을 애플리케이션이 검사할 수 있도록 합니다.

  • javax.net.ssl.trustStore서명 기관의 인증서가 포함된 신뢰 저장소의 경로

  • javax.net.ssl.trustStorePassword에서 정의된 신뢰 저장소에 액세스하기 위한 비밀번호 javax.net.ssl.trustStore

JDK의 일부로 제공되는 keytool 명령줄 도구를 사용하여 신뢰 저장소를 만들 수 있습니다:

keytool -importcert -trustcacerts -file <path to certificate authority file>
-keystore <path to trust store> -storepass <password>

참고

기본적으로 MongoDB 인스턴스는 클라이언트 인증서 유효성 검사를 수행하지 않습니다. 클라이언트 인증서의 유효성을 검사하도록 MongoDB 인스턴스를 구성한 경우 키 저장소를 구성해야 합니다.

JVM 키 저장소는 Java 애플리케이션을 다른 애플리케이션에 안전하게 식별하는 인증서를 저장합니다. 이러한 인증서를 사용하면 다른 애플리케이션에서 상대 애플리케이션에 대한 연결이 진짜이고 제3자의 변조로부터 안전하다는 것을 증명할 수 있습니다.

TLS/SSL 요청을 시작하는 애플리케이션은 클라이언트가 MongoDB 배포에 TLS/SSL 인증서를 제공하도록 두 개의 JVM 시스템 속성을 설정해야 합니다.

  • javax.net.ssl.keyStore: 클라이언트의 TLS/SSL 인증서가 포함된 키 저장소의 경로

  • javax.net.ssl.keyStorePassword: 정의된 키 저장소에 액세스하기 위한 비밀번호 javax.net.ssl.keyStore

keytool 또는 openssl 명령줄 도구를 사용하여 키 저장소를 만들 수 있습니다.

TLS/SSL을 사용하도록 Java 애플리케이션을 구성하는 방법에 대한 자세한 내용은 JSSE 참조 가이드를 참조하세요.

SSLContext 클래스의 init() 메서드를 사용하여 클라이언트별 신뢰 저장소 및 키 저장소를 구성할 수 있습니다.

SSLContext 인스턴스로 클라이언트를 구성하는 방법을 보여주는 예는 이 가이드의 SSLContext를 사용하여 TLS/SSL 구성 사용자 지정 섹션에서 찾을 수 있습니다.

클래스에 대한 자세한 내용은 SSLContext SSL 컨텍스트에대한 API 설명서를 참조하세요.

기본적으로 드라이버는 서버의 TLS/SSL 인증서에 포함된 호스트 이름이 MongoClient를 구축할 때 제공된 호스트 이름과 일치하는지 확인합니다. 애플리케이션에 대해 호스트 이름 확인을 비활성화하려면 applytoSslSettings() 빌더 lambda에서 빌더의 invalidHostNameAllowed 속성을 true로 설정하여 명시적으로 비활성화할 수 있습니다:

MongoClientSettings settings = MongoClientSettings.builder()
.applyToSslSettings(builder -> {
builder.enabled(true);
builder.invalidHostNameAllowed(true);
})
.build();

경고

호스트 이름 확인을 비활성화하면 구성이 안전하지 않을 수 있습니다. 테스트 목적으로만 또는 다른 대안이 없는 경우에만 호스트 이름 확인을 비활성화하세요.

애플리케이션이 TLS 1.2 프로토콜만 사용하도록 제한하려면 jdk.tls.client.protocols 시스템 속성을 'TLSv1.2'로 설정합니다.

참고

Java 8 이전의 Java Runtime Environment(JRE)에서는 업데이트 릴리스에서 TLS 1.2 프로토콜만을 활성화했습니다. JRE에서 TLS 1.2 프로토콜을 활성화하지 않은 경우, 이후 릴리스로 업그레이드하여 TLS 1.2를 사용하여 연결합니다.

TLS/SSL 구성에 사용자 지정이 필요한 경우, applyToSslSettings() lambda의 빌더에 SSLContext 객체를 전달하여 MongoClientsslContext 속성을 다음과 같이 설정할 수 있습니다.

SSLContext sslContext = ...
MongoClientSettings settings = MongoClientSettings.builder()
.applyToSslSettings(builder -> {
builder.enabled(true);
builder.context(sslContext);
})
.build();
MongoClient client = MongoClients.create(settings);

네트워크 IO를 위해 Netty와 함께 드라이버를 사용하는 경우, Netty에서 제공하는 대체 TLS/SSL 프로토콜 구현을 연결할 수 있습니다.

import com.mongodb.MongoClientSettings;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoClient;
import com.mongodb.connection.netty.NettyStreamFactoryFactory;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import io.netty.handler.ssl.SslProvider;

참고

Netty 버전으로 드라이버 테스트 io.netty:netty-all:4.1.79.Final

드라이버에 io.netty.handler.ssl.SslContext를 사용하도록 지시하려면 NettyStreamFactoryFactory.Builder.sslContext 메서드를 사용하세요. 드라이버가 지원하는 다양한 io.netty.handler.ssl.SslProvider 변형과 그 사용의 의미에 대한 자세한 내용은 메서드 설명서를 참조하세요.

SslContext sslContext = SslContextBuilder.forClient()
.sslProvider(SslProvider.OPENSSL)
.build();
MongoClientSettings settings = MongoClientSettings.builder()
.applyToSslSettings(builder -> builder.enabled(true))
.streamFactoryFactory(NettyStreamFactoryFactory.builder()
.sslContext(sslContext)
.build())
.build();
MongoClient client = MongoClients.create(settings);

OCSP는 X.509 인증서가 해지되었는지 확인하는 데 사용되는 표준입니다. 인증 기관은 만료 시간 전에 X.509 인증서를 인증서 해지 목록(CRL)에 추가하여 인증서를 무효화할 수 있습니다. 클라이언트가 TLS 핸드셰이크 중에 X.509 인증서를 보내면 CA의 해지 서버는 CRL을 확인하여 '정상', '해지됨', 또는 '알 수 없음' 상태를 반환합니다.

이 드라이버는 다음과 같은 OCSP 변형을 지원합니다:

  • 클라이언트 중심 OCSP

  • OCSP 스테이플링

다음 섹션에서는 이들 간의 차이점과 애플리케이션에서 이를 활성화하는 방법을 설명합니다.

참고

Java 드라이버는 애플리케이션에 대해 구성된 JVM 인수를 사용하며 특정 MongoClient 인스턴스에 대해 재정의할 수 없습니다.

클라이언트 기반 OCSP에서 클라이언트는 서버로부터 인증서를 받은 후 OCSP 요청의 인증서를 OCSP 응답자에게 보냅니다. OCSP 응답자는 CA(인증 기관)를 통해 인증서 상태를 확인하고 클라이언트에 보낸 응답에서 인증서가 유효한지 여부를 보고합니다.

애플리케이션에 대해 클라이언트 기반 OCSP를 활성화하려면 다음 JVM 시스템 속성을 설정합니다.

속성
com.sun.net.ssl.checkRevocation
해지 확인을 활성화하려면 이 속성을 true로 설정합니다.
ocsp.enable
클라이언트 기반 OCSP를 활성화하려면 이 속성을 true로 설정하세요.

경고

OCSP 응답자를 사용할 수 없는 경우 JDK에서 제공하는 TLS 지원은 '강력한 실패(hard fail)'를 보고합니다. 이는 MongoDB Shell 및 일부 다른 드라이버의 '약한 실패(soft fail)' 동작과는 다릅니다.

OCSP 스테이플링은 서버가 인증 기관(CA)으로부터 서명된 인증서를 받아 클라이언트에 보낼 타임스탬프가 있는 OCSP 응답에 포함시켜야 하는 메커니즘입니다.

애플리케이션에 대해 OCSP 스테이플링을 활성화하려면 다음 JVM 시스템 속성을 설정합니다.

속성
설명
com.sun.net.ssl.checkRevocation
해지 확인을 활성화하려면 이 속성을 true로 설정합니다.
jdk.tls.client.enableStatusRequestExtension
Set this property to true to enable OCSP stapling.

If unset or set to false, the connection can proceed regardless of the presence or status of the certificate revocation response.

OCSP에 대한 자세한 내용은 다음 리소스를 참조하세요.

돌아가기

네트워크 압축