Docs Menu
Docs Home
/ / /
C++ 드라이버
/

TLS(전송 계층 보안) 구성

이 페이지의 내용

  • 개요
  • TLS 활성화
  • CA 파일 지정
  • CA 디렉토리 지정
  • 인증서 철회 확인
  • OCSP
  • 인증서 해지 목록
  • 클라이언트 인증서 제시
  • 키 비밀번호 제공
  • 안전하지 않은 TLS 허용
  • API 문서

이 가이드 에서는 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 구성 을 참조하세요.

MongoDB 인스턴스 연결에 TLS를 활성화 하려면 다음 예시 와 같이 연결 string 에서 tls 연결 옵션을 true 로 설정하다 합니다.

mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true");

연결 string 에 SRV 연결 형식을 지정하는 +srv 수정이 포함된 경우 기본적으로 연결에서 TLS가 활성화됩니다.

SRV 연결 형식에 학습 보려면 MongoDB Server 설명서에서 SRV 연결 형식 을 참조하세요.

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");

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) 프로세스 는 연결하려는 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가 활성화되면 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, tlsAllowInvalidCertificatestlsAllowInvalidHostnames 옵션을 항상 false 로 설정합니다.

프로덕션 환경에서 이러한 옵션 중 하나를 true 로 설정하면 애플리케이션이 안전하지 않고 만료된 인증서와 유효한 클라이언트 인스턴스로 가장하는 외부 프로세스에 잠재적으로 취약해집니다.

C++ 운전자 의 TLS 구성에 학습 보려면 다음 API 설명서를 참조하세요.

돌아가기

연결 옵션 지정