TLS/SSL
이 페이지의 내용
기본적으로 드라이버는 JDK에서 제공하는 TLS/SSL에 대한 기본 지원을 사용하여 MongoDB 서버에 대한 TLS/SSL 연결을 지원합니다. 이는 Java SE API 의 확장성을 활용하여 변경할 수 있습니다. 또는 Netty API를 사용합니다.
MongoClient API
ConnectionString
또는 MongoClientSettings
인스턴스에서 옵션을 지정하여 드라이버가 TLS/SSL을 사용하도록 구성할 수 있습니다.
ConnectionString에 TLS/SSL 지정
다음 가져오기 문을 포함합니다.
import com.mongodb.reactivestreams.client.MongoClients; import com.mongodb.reactivestreams.client.MongoClient;
ConnectionString
에서 TLS/SSL을 지정하려면 연결 string 의 일부로 ssl=true
를 지정합니다.
MongoClient mongoClient = MongoClients.create("mongodb://localhost/?ssl=true");
MongoClientSettings에서 TLS/SSL 지정
다음 가져오기 문을 포함합니다.
import com.mongodb.MongoClientSettings; import com.mongodb.reactivestreams.client.MongoClients; import com.mongodb.reactivestreams.client.MongoClient;
MongoClientSettings
인스턴스에서 TLS/SSL을 지정하려면 enabled
속성을 true
로 설정합니다.
MongoClientSettings settings = MongoClientSettings.builder() .applyToSslSettings(builder -> builder.enabled(true)) .build(); MongoClient client = MongoClients.create(settings);
MongoClientSettings에서 Java SE SSLContext 지정
다음 가져오기 문을 포함합니다.
import javax.net.ssl.SSLContext; import com.mongodb.MongoClientSettings; import com.mongodb.MongoClient;
MongoClientSettings
을 사용하여 javax.net.ssl.SSLContext
을 지정하려면 sslContext
속성을 설정합니다.
SSLContext sslContext = ... MongoClientSettings settings = MongoClientSettings.builder() .applyToSslSettings(builder -> builder.enabled(true).context(sslContext)) .build(); MongoClient client = new MongoClient(settings);
Netty SslContext를 통한 TLS/SSL 구성 사용자 지정
다음 가져오기 문을 포함합니다.
import com.mongodb.MongoClientSettings; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoClient; 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.87.Final
드라이버에 io.netty.handler.ssl.SslContext 를 사용하도록 지시하려면 ,NettyTransportSettings 구성 을(를) 정의할 때 MongoClientSettings
MongoClientSettings.Builder.transportSettings()
및 NettyTransportSettings.Builder.sslContext()
을 사용하여 설정을 빌드 합니다.
SslContext sslContext = SslContextBuilder.forClient() .sslProvider(SslProvider.OPENSSL) .build(); MongoClientSettings settings = MongoClientSettings.builder() .applyToSslSettings(builder -> builder.enabled(true)) .transportSettings(TransportSettings.nettyBuilder() .sslContext(sslContext) .build()) .build(); MongoClient client = MongoClients.create(settings);
에 대한 자세한 io.netty.handler.ssl.SslProvider
내용은 Netty 문서를 참조하세요.
호스트 이름 확인 사용 안 함
기본적으로 드라이버는 서버의 SSL 인증서에 포함된 호스트 이름이 MongoClient
구성 시 제공된 호스트 이름과 일치하는지 확인합니다.
애플리케이션에서 호스트 이름 확인을 비활성화해야 하는 경우 MongoClientSettings
에 이를 명시적으로 표시해야 합니다.
MongoClientSettings settings = MongoClientSettings.builder() .applyToSslSettings(builder -> { builder.enabled(true); builder.invalidHostNameAllowed(true); }) .build();
일반적인 TLS/SSL 구성 작업
이 섹션은 Oracle JDK 설명서를 기반으로 합니다. , 따라서 일부 부분은 사용 중인 JDK 또는 사용자 지정 TLS/SSL 구현에 적용되지 않을 수 있습니다.
신뢰 저장소 및 키 저장소 구성
javax.net.ssl.SSLContext.init(KeyManager[] km,
TrustManager[] tm, SecureRandom random)
을(를) 사용하여 클라이언트와 관련된 신뢰 저장소 및 키 저장소를 구성하거나 JVM 기본값을 설정할 수 있습니다.
기본 신뢰 저장소 설정
일반적인 애플리케이션은 클라이언트가 서버에서 제공하는 TLS/SSL 인증서의 유효성 을 검사할 수 있도록 여러 JVM 시스템 속성을 설정해야 합니다.
javax.net.ssl.trustStore
서명 기관의 인증서가 포함된 신뢰 저장소의 경로javax.net.ssl.trustStorePassword
: 이 신뢰 저장소에 액세스하기 위한 비밀번호
신뢰 저장소는 일반적으로 JDK의 일부로 제공되는 keytool
명령줄 프로그램을 사용하여 생성됩니다.
keytool -importcert -trustcacerts -file <path to certificate authority file> -keystore <path to trust store> -storepass <trust store password>
기본 키 저장소 설정
일반적인 애플리케이션은 클라이언트가 MongoDB 서버에 TLS/SSL 클라이언트 인증서를 제공 하도록 여러 JVM 시스템 속성을 설정해야 합니다.
javax.net.ssl.keyStore
: 클라이언트 TLS/SSL 인증서가 포함된 키 저장소의 경로javax.net.ssl.keyStorePassword
: 이 키 저장소에 액세스하기 위한 비밀번호
키 저장소는 일반적으로 keytool
또는 openssl
명령줄 프로그램을 사용하여 생성됩니다. 예를 들어 클라이언트 인증서와 해당 비공개 키가 포함된 파일이 있고 PKCS # 에12 키 저장소를 생성하려는 경우 형식의 경우 다음 명령을 실행할 수 있습니다.
openssl pkcs12 -export -in <path to client certificate & private key file> -out <path to key store> -passout pass:<trust store password>
TLS/SSL을 위한 Java 애플리케이션 구성에 대해 자세히 알아보려면 JSSE 참조 가이드를 참조하세요.
강제 TLS v1.2
일부 애플리케이션은 TLS 1.2 프로토콜만 강제 적용하고자 할 수 있습니다. 이렇게 하려면 jdk.tls.client.protocols
시스템 속성을 TLSv1.2
로 설정합니다.
Java 8 이전의 Java 런타임 환경은 이전 섹션에 표시된 대로 이후 업데이트에서만 TLS 1.2 프로토콜을 활성화했습니다. 드라이버가 Java 8 이전의 Java 런타임 환경에서 TLS 1.2 프로토콜을 사용하도록 하려면 업데이트에 TLS 1.2 이 활성화되어 있는지 확인합니다.
OCSP
참고
드라이버는 기본적으로 개별 MongoClient
단위로 OCSP를 활성화할 수 없습니다.
클라이언트 중심 OCSP
클라이언트 기반 OCSP가 활성화되도록 하려면 애플리케이션에서 다음 JVM 시스템 및 보안 속성을 설정해야 합니다.
com.sun.net.ssl.checkRevocation
:true
로 설정하면 이 시스템 속성이 해지 확인을 활성화합니다.ocsp.enable
:true
로 설정하면 이 보안 속성이 클라이언트 기반 OCSP를 활성화합니다.
클라이언트 기반 OCSP를 사용하도록 애플리케이션을 구성하려면 애플리케이션이 TLS를 사용하여 서버에 연결하도록 이미 설정되어 있어야 합니다. 클라이언트 기반 OCSP를 사용하려면 이러한 시스템 속성을 설정해야 합니다.
참고
JDK에서 제공하는 TLS 지원은 mongosh
및 "소프트 페일" 동작을 활용하는 드라이버와 달리 OCSP 응답자를 사용할 수 없는 경우 "하드 페일" 동작을 활용합니다.
OCSP 스테이플링
중요
다음 예외는 TLS 1.3 프로토콜을 사용하는 Java 런타임 환경에서 OCSP 스테이플링을 사용할 때 발생할 수 있습니다(Java 11 이상은 기본적으로 TLS 1.3 사용).
javax.net.ssl.SSLHandshakeException: extension (5) should not be presented in certificate_request
예외는 Java 11 이상에서 TLS 1.3 의 알려진 문제로 인해 발생합니다. TLS 1.3 프로토콜에서 작동하는 Java 런타임 환경을 사용할 때 이 예외를 방지하려면 애플리케이션이 TLS 1.2 프로토콜을 사용하도록 강제할 수 있습니다. 이렇게 하려면 jdk.tls.client.protocols
시스템 속성을 TLSv1.2
로 설정합니다.
애플리케이션은 OCSP 스테이플링을 설정하기 위해 여러 JVM 시스템 속성을 설정해야 합니다.
jdk.tls.client.enableStatusRequestExtension
:true
(기본값)으로 설정하면 OCSP 스테이플링이 활성화됩니다.com.sun.net.ssl.checkRevocation
:true
로 설정하면 해지 확인이 활성화됩니다. 이 속성이true
로 설정되지 않은 경우 해지 정보의 유무에 관계없이 연결이 계속 진행됩니다.
OCSP 스테이플링을 사용하도록 애플리케이션을 구성하려면 애플리케이션이 TLS를 사용하여 서버에 연결하도록 이미 설정되어 있어야 하며, TLS 핸드셰이크의 일부로 반환되는 인증서에 OCSP 응답을 스테이플링하도록 서버를 설정해야 합니다.
OCSP를 사용하도록 Java 애플리케이션을 구성하는 방법에 대해 자세히 알아보려면 클라이언트 기반 OCSP 및 OCSP 스테이플링 을 참조하세요. Java 문서에서 확인할 수 있습니다.