TLS(전송 계층 보안) 구성
개요
이 가이드 에서는 TLS 사용 방법을 학습 수 있습니다. 프로토콜 을 사용하여 MongoDB deployment 에 대한 연결을 보호합니다.
연결에 TLS를 활성화 하도록 설정하면 C++ 운전자 는 다음 작업을 수행합니다.
TLS를 사용하여 MongoDB deployment에 연결
배포서버의 인증서를 확인합니다.
인증서가 배포를 인증하는지 확인합니다.
TLS를 위해 MongoDB deployment 를 구성하는 방법을 학습 보려면 MongoDB Server 매뉴얼의 TLS 구성 가이드 를 참조하세요.
참고
이 페이지에서는 TLS/SSL에 대한 사전 지식이 있고 유효한 인증서에 액세스 있다고 가정합니다. TLS/SSL, PKI(공개 키 인프라) 인증서 및 인증 기관(CA)에 대한 전체 설명은 이 문서의 범위를 벗어납니다.
팁
C++ 운전자 는 대부분의 TLS 동작을 MongoDB C 드라이버 에 위임합니다. 구성 단계 및 예상 동작을 포함하여 C 운전자 가 TLS를 처리하는 방법에 대한 자세한 내용은 C 운전자 설명서에서 TLS 구성 을 참조하세요.
TLS 활성화
MongoDB 인스턴스 연결에 TLS를 활성화 하려면 다음 예시 와 같이 연결 string 에서 tls
연결 옵션을 true
로 설정하다 합니다.
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true");
팁
연결 string 에 SRV 연결 형식을 지정하는 +srv
수정이 포함된 경우 기본적으로 연결에서 TLS가 활성화됩니다.
SRV 연결 형식에 학습 보려면 MongoDB Server 설명서에서 SRV 연결 형식 을 참조하세요.
CA 파일 지정
TLS 핸드셰이크 중에 MongoDB deployment는 애플리케이션에 인증서 키 파일을 제공하여 ID를 설정합니다. 일반적으로 배포 인증서는 잘 알려진 CA에서 서명했으며 애플리케이션은 이 CA를 사용하여 인증서의 유효성을 검사합니다.
그러나 테스트 중에는 자체 CA 역할을 할 수 있습니다. 이 경우 다른 CA에서 서명한 인증서 대신 자신의 CA 인증서를 사용하도록 C++ 운전자 에 지시해야 합니다.
이렇게 하려면 루트 인증서 체인이 포함된 .pem
파일 의 경로를 지정합니다. mongocxx::options::tls
객체 에 속성 을 설정하거나 연결 string 의 tlsCAFile
매개변수를 사용하는 두 가지 방법으로 이 작업을 수행할 수 있습니다.
mongocxx::options::client client_options; mongocxx::options::tls tls_options; tls_options.pem_file("/path/to/file.pem"); client_options.tls_opts(tls_options); mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true"); mongocxx::client client(uri, client_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsCAFile=/path/to/file.pem");
CA 디렉토리 지정
TLS 지원 을 위해 OpenSSL 또는 LibreSSL(libtls
)을 사용하는 경우 디렉토리 내에서 CA 파일 을 검색 하도록 C++ 운전자 에 지시할 수도 있습니다. 운전자 는 tlsCAFile
또는 pem_file
옵션에 지정된 경로에서 CA 파일 을 찾지 못하면 이 디렉토리 를 검색합니다.
다음 코드 예시 에서는 ca_dir
옵션을 사용하여 운전자 가 검색 해야 하는 디렉토리 를 지정하는 방법을 보여 줍니다.
mongocxx::options::client client_options; mongocxx::options::tls tls_options; tls_options.ca_dir("/path/to/search/"); client_options.tls_opts(tls_options); mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true"); mongocxx::client client(uri, client_options);
팁
이 옵션은 OpenSSL SSL_CTX_load_verify_locations 에 해당합니다. 매개변수 및 LibreSSL tls_config_set_ca_path 매개변수.
인증서 철회 확인
X.509 인증서를 더 이상 신뢰할 수 없는 경우( 예시: 비공개 키가 손상된 경우) CA는 인증서를 해지합니다. C++ 운전자 에는 서버의 인증서가 해지되었는지 여부를 확인하는 두 가지 방법이 포함되어 있습니다.
OCSP
온라인 인증서 상태 프로토콜(OCSP) 프로세스 는 연결하려는 MongoDB Server 의 버전에 따라 다릅니다.
MongoDB v4.4 이상: 서버 가 타임스탬프가 지정된 OCSP 응답을 인증서에 스테이플링합니다. C++ 운전자 는 OCSP 응답을 기준으로 인증서의 유효성을 검사합니다. CA가 인증서를 해지했거나 OCSP 응답이 유효하지 않은 경우 TLS 핸드셰이크가 실패합니다.
MongoDB v4.3 이하 버전: 서버 가 C++ 운전자 가 직접 연결하는 OCSP 엔드포인트를 제공합니다. 그런 다음 C++ 운전자 는 OCSP 응답과 비교하여 인증서의 유효성을 검사합니다. CA가 인증서를 해지하지 않은 경우 OCSP 응답이 유효하지 않거나 잘못된 경우에도 TLS 핸드셰이크가 계속됩니다.
C++ 운전자 가 OCSP 엔드포인트에 연결하지 못하도록 하려면 다음 코드 예시 와 같이 연결 string 에서 tlsDisableOCSPEndpointCheck
연결 옵션을 true
로 설정하다 합니다.
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsDisableOCSPEndpointCheck=true");
인증서 해지 목록
OCSP를 사용하는 대신 C++ 운전자 에 CA에서 게시한 CRL(인증서 해지 목록)과 비교하여 서버의 인증서를 확인하도록 지시할 수 있습니다.
다음 코드 예시 에서는 crl_file
옵션을 사용하여 경로를 지정하여 CA에서 .pem
파일 의 경로를 지정하는 방법을 보여 줍니다.
mongocxx::options::client client_options; mongocxx::options::tls tls_options; tls_options.crl_file("/path/to/file.pem"); client_options.tls_opts(tls_options); mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true"); mongocxx::client client(uri, client_options);
팁
CRL 파일 을 .pem
또는 .der
형식으로 지정할 수 있습니다.
클라이언트 인증서 제시
일부 MongoDB 배포에서는 모든 연결 애플리케이션 이 ID를 증명하는 클라이언트 인증서를 제시해야 합니다. C++ 운전자 가 제시할 클라이언트 인증서를 지정하려면 인증서와 비공개 키가 포함된 .pem
파일 의 파일 경로를 지정합니다.
mongocxx::options::tls
객체 에 속성 을 설정하거나 연결 string 의 tlsCertificateKeyFile
매개변수를 사용하는 두 가지 방법으로 이 작업을 수행할 수 있습니다.
mongocxx::options::client client_options; mongocxx::options::tls tls_options; tls_options.pem_file("/path/to/file.pem"); client_options.tls_opts(tls_options); mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true"); mongocxx::client client(uri, client_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsCertificateKeyFile=/path/to/file.pem");
중요
클라이언트 인증서와 비공개 키는 동일한 .pem
파일에 있어야 합니다. 서로 다른 파일에 저장되어 있는 경우에는 연결해야 합니다. 다음 예는 Unix 시스템에서 키 파일과 인증서 파일을 combined.pem
라는 세 번째 파일로 연결하는 방법을 보여줍니다.
cat key.pem cert.pem > combined.pem
키 비밀번호 제공
인증서 파일 의 비공개 키가 암호화됨 경우 비밀번호를 제공해야 합니다. mongocxx::options::tls
객체 에 속성 을 설정하거나 연결 string 의 tlsCertificateKeyFilePassword
매개변수를 사용하는 두 가지 방법으로 이 작업을 수행할 수 있습니다.
mongocxx::options::client client_options; mongocxx::options::tls tls_options; tls_options.pem_file("/path/to/file.pem"); tls_options.pem_password("<password>"); client_options.tls_opts(tls_options); mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true"); mongocxx::client client(uri, client_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsCertificateKeyFile=/path/to/file.pem&tlsCertificateKeyFilePassword=<password>");
안전하지 않은 TLS 허용
TLS가 활성화되면 C++ 운전자 는 서버 가 제공하는 인증서를 자동으로 확인합니다. 코드를 테스트할 때 이 확인을 비활성화할 수 있습니다. 이를 안전하지 않은 TLS라고 합니다.
안전하지 않은 TLS를 사용하도록 설정하면 운전자 는 서버 가 X.509 인증서를 제시하기만 하면 됩니다. 운전자 는 다음 중 하나에 해당하는 경우에도 인증서를 수락합니다.
서버의 호스트 이름과 인증서의 주체 이름(또는 주체 대체 이름)이 일치하지 않는 경우
인증서가 만료되었거나 아직 유효하지 않습니다.
인증서의 체인에 신뢰할 수 있는 루트 인증서가 없는 경우
인증서 용도가 서버 식별에 유효하지 않은 경우
참고
안전하지 않은 TLS가 활성화된 경우에도 클라이언트와 서버 간의 통신은 TLS로 암호화됩니다.
안전하지 않은 TLS를 활성화 하려면 다음 코드 예시 와 같이 연결 string 에서 tlsInsecure
연결 옵션을 true
로 설정하다 합니다.
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsInsecure=true");
인증서 유효성 검사 만 비활성화하려면 tlsAllowInvalidCertificates
옵션을 true
로 설정하다 하고 tlsInsecure
옵션을 false
(또는 생략)으로 설정하다 합니다.
mongocxx::options::client client_options; mongocxx::options::tls tls_options; tls_options.allow_invalid_certificates(true); client_options.tls_opts(tls_options); mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true"); mongocxx::client client(uri, client_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsAllowInvalidCertificates=true");
호스트 이름 확인만 비활성화하려면 tlsAllowInvalidHostnames
옵션을 true
로 설정하다 하고 tlsInsecure
옵션을 false
(또는 생략)으로 설정하다 합니다.
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsAllowInvalidHostnames=true");
경고
프로덕션 환경에서는 사용하지 마세요.
프로덕션 환경에서는 tlsInsecure
, tlsAllowInvalidCertificates
및 tlsAllowInvalidHostnames
옵션을 항상 false
로 설정합니다.
프로덕션 환경에서 이러한 옵션 중 하나를 true
로 설정하면 애플리케이션이 안전하지 않고 만료된 인증서와 유효한 클라이언트 인스턴스로 가장하는 외부 프로세스에 잠재적으로 취약해집니다.
API 문서
C++ 운전자 의 TLS 구성에 학습 보려면 다음 API 설명서를 참조하세요.