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