사용자 제공 인증서로 상호 TLS 설정

이 페이지에서는 루트 인증서 및 서명된 중간 인증서를 만든 후 이러한 인증서를 인증서 관리자 TrustConfig 리소스에 업로드하는 방법을 설명합니다. 업로드할 기존 인증서가 있으면 새 인증서를 만드는 단계를 건너뜁니다.

또한 애플리케이션 부하 분산기에 상호 TLS(mTLS)를 구성하는 데 필요한 네트워크 보안 리소스를 만듭니다. 이 안내에서는 OpenSSL을 사용하여 루트 및 중간 인증서를 만듭니다.

시작하기 전에

권한

이 가이드를 완료하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

  • TargetHTTPSProxy와 같은 부하 분산기 리소스 만들기: Compute 부하 분산기 관리자(roles/compute.loadBalancerAdmin)
  • 인증서 관리자 리소스 사용하기: 인증서 관리자 소유자(roles/certificatemanager.owner)
  • 보안 및 네트워킹 구성요소 만들기: Compute 네트워크 관리자(roles/compute.networkAdmin) 및 Compute 보안 관리자(roles/compute.securityAdmin)
  • 프로젝트 만들기(선택사항): 프로젝트 생성자(roles/resourcemanager.projectCreator)

역할 부여에 대한 자세한 내용은 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

키 및 서명된 인증서 생성

이 섹션에서는 openssl 명령어를 사용하여 루트 인증서와 중간 인증서를 만듭니다.

다음 명령어를 사용하여 유효한 keyUsageextendedKeyUsage 필드가 있는 루트 인증서와 서명된 중간 인증서를 생성합니다.

  1. 유효한 서명 인증서를 만드는 데 필요한 최소 구성으로 샘플 example.cnf 파일을 만듭니다. 이러한 인증서에 추가 필드를 설정하려면 이 파일을 수정하면 됩니다.

    cat > example.cnf << EOF
    [req]
    distinguished_name = empty_distinguished_name
    [empty_distinguished_name]
    # Kept empty to allow setting via -subj command line arg.
    [ca_exts]
    basicConstraints=critical,CA:TRUE
    keyUsage=keyCertSign
    extendedKeyUsage=clientAuth
    EOF
    
  2. 루트 인증서를 만듭니다.

    openssl req -x509 \
        -new -sha256 -newkey rsa:2048 -nodes \
        -days 3650 -subj '/CN=root' \
        -config example.cnf \
        -extensions ca_exts \
        -keyout root.key -out root.cert
    
  3. 중간 인증서에 대한 서명 요청을 만듭니다.

    openssl req \
        -new -sha256 -newkey rsa:2048 -nodes \
        -subj '/CN=int' \
        -config example.cnf \
        -extensions ca_exts \
        -keyout int.key -out int.req
    
  4. 중간 인증서를 만듭니다.

    openssl x509 -req \
        -CAkey root.key -CA root.cert \
        -set_serial 1 \
        -days 3650 \
        -extfile example.cnf \
        -extensions ca_exts \
        -in int.req -out int.cert
    

허용 목록에 추가된 인증서 생성

이 섹션에서는 openssl 명령어를 사용하여 허용 목록에 추가된 샘플 인증서를 만듭니다.

다음 명령어를 사용하여 허용 목록에 추가된 인증서를 생성합니다.

   openssl req -x509 \
       -new -sha256 -newkey rsa:2048 -nodes \
       -days 3650 -subj '/CN=localhost' \
       -keyout allowlisted.key -out allowlisted.cert

인증서 형식 지정

TrustStore에 새 인증서 또는 기존 인증서를 포함하려면 YAML 파일로 읽어 들일 수 있도록 인증서를 한 줄 형식으로 지정하고 환경 변수에 저장합니다. 다음 명령어를 사용하여 인증서 형식을 지정하고 환경 변수에 저장합니다.

export ROOT_CERT=$(cat root.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')
export INTERMEDIATE_CERT=$(cat int.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')

트러스트 구성에 허용 목록에 추가된 새 인증서 또는 기존 인증서를 포함하려면 YAML 파일로 읽어 들일 수 있도록 인증서를 한 줄 형식으로 지정하고 환경 변수에 저장합니다. 다음 명령어를 사용하여 허용 목록에 추가된 인증서의 형식을 지정하고 환경 변수에 저장합니다.

export ALLOWLISTED_CERT=$(cat allowlisted.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')

TrustConfig 리소스 만들기

PKI를 나타내는 인증서 관리자 TrustConfig 리소스를 만듭니다. 이 예시 TrustConfig 리소스에는 신뢰 앵커 2개와 중간 CA 인증서 2개가 있는 트러스트 저장소가 포함됩니다. 이전 인증서 형식 지정 단계에서 만든 환경 변수에서 인증서 콘텐츠를 읽습니다.

추가 신뢰 앵커 또는 중간 CA 인증서를 사용하여 트러스트 저장소를 만들려면 적절한 섹션에 pemCertificate 행을 추가합니다. 신뢰 앵커 또는 중간 CA 인증서 수가 적으면 불필요한 줄을 삭제합니다.

이 예시 TrustConfig 리소스에는 허용 목록에 추가된 인증서가 포함되어 있습니다. pemCertificate 필드의 여러 인스턴스를 사용하여 허용 목록에 추가된 여러 인증서를 지정할 수 있습니다.

다음 단계에서 TRUST_CONFIG_NAMETrustConfig 리소스의 이름으로 바꿉니다.

  1. 트러스트 저장소를 포함하여 trust_config.yaml 파일을 만들려면 다음 명령어를 사용합니다.

    cat << EOF > trust_config.yaml
    trustStores:
    - trustAnchors:
      - pemCertificate: "${ROOT_CERT?}"
      - pemCertificate: "${ROOT_CERT_2?}"
      intermediateCas:
      - pemCertificate: "${INTERMEDIATE_CERT?}"
      - pemCertificate: "${INTERMEDIATE_CERT_2?}"
    EOF
    
  2. 선택사항: 허용 목록에 추가된 인증서로 trust_config.yaml 파일을 만들려면 다음 명령어를 사용합니다.

    cat << EOF > trust_config.yaml
     allowlistedCertificates:
     - pemCertificate: "${ALLOWLISTED_CERT?}"
    EOF
    
  3. 인증서 관리자 TrustConfig 리소스를 만들려면 gcloud certificate-manager trust-configs import 명령어를 사용합니다.

    전역

    외부 애플리케이션 부하 분산기와 리전 간 내부 애플리케이션 부하 분산기의 경우 다음 명령어를 사용합니다.

    gcloud certificate-manager trust-configs import TRUST_CONFIG_NAME  \
       --source=trust_config.yaml
    

    리전

    리전 외부 애플리케이션 부하 분산기와 리전 내부 애플리케이션 부하 분산기의 경우 다음 명령어를 사용합니다.

    gcloud certificate-manager trust-configs import TRUST_CONFIG_NAME  \
       --source=trust_config.yaml \
       --location=REGION
    

네트워크 보안 리소스 만들기

서버 TLS 정책(ServerTLSPolicy 네트워크 보안 리소스)을 사용하면 클라이언트 인증서 유효성을 검사할 때 사용할 서버 측 TLS 모드와 TrustConfig 리소스를 지정할 수 있습니다. 클라이언트가 부하 분산기에 잘못된 인증서를 제공하거나 인증서를 제공하지 않으면 clientValidationMode는 클라이언트 연결이 처리되는 방법을 지정합니다.

  • clientValidationModeALLOW_INVALID_OR_MISSING_CLIENT_CERT로 설정되면 검증이 실패하거나 클라이언트 인증서가 없는 경우에도 모든 요청이 백엔드로 전달됩니다.
  • clientValidationModeREJECT_INVALID로 설정되면 TrustConfig 리소스에 대해 검증할 수 있는 클라이언트 인증서를 제공하는 요청만 백엔드로 전달됩니다.

ServerTLSPolicy 저장소를 만들려면 다음 단계를 완료하세요.

  1. 연결을 처리하는 방법에 따라 다음 옵션 중 하나를 선택합니다.

    다음 단계에서 SERVER_TLS_POLICY_NAME을 서버 TLS 정책의 이름으로 바꾸고 PROJECT_ID를 Google Cloud 프로젝트의 ID로 바꿉니다.

    • 옵션 1: clientValidationModeALLOW_INVALID_OR_MISSING_CLIENT_CERT로 설정되어 있습니다.

      server_tls_policy.yaml 파일을 만들려면 다음 명령어를 사용합니다.

      전역

      외부 애플리케이션 부하 분산기와 리전 간 내부 애플리케이션 부하 분산기의 경우 다음 명령어를 사용합니다.

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
        clientValidationMode: ALLOW_INVALID_OR_MISSING_CLIENT_CERT
        clientValidationTrustConfig: projects/PROJECT_ID/locations/global/trustConfigs/TRUST_CONFIG_NAME
      EOF
      

      리전

      리전 외부 애플리케이션 부하 분산기와 리전 내부 애플리케이션 부하 분산기의 경우 다음 명령어를 사용합니다.

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
        clientValidationMode: ALLOW_INVALID_OR_MISSING_CLIENT_CERT
        clientValidationTrustConfig: projects/PROJECT_ID/locations/REGION/trustConfigs/TRUST_CONFIG_NAME
      EOF
      
    • 옵션 2: clientValidationModeREJECT_INVALID로 설정되어 있습니다.

      server_tls_policy.yaml 파일을 만들려면 다음 명령어를 사용합니다.

      전역

      외부 애플리케이션 부하 분산기와 리전 간 내부 애플리케이션 부하 분산기의 경우 다음 명령어를 사용합니다.

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
        clientValidationMode: REJECT_INVALID
        clientValidationTrustConfig: projects/PROJECT_ID/locations/global/trustConfigs/TRUST_CONFIG_NAME
      EOF
      

      리전

      리전 외부 애플리케이션 부하 분산기와 리전 내부 애플리케이션 부하 분산기의 경우 다음 명령어를 사용합니다.

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
        clientValidationMode: REJECT_INVALID
        clientValidationTrustConfig: projects/PROJECT_ID/locations/REGION/trustConfigs/TRUST_CONFIG_NAME
      EOF
      
  2. ServerTlsPolicy 리소스를 만들려면 gcloud network-security server-tls-policies import 명령어를 사용합니다.

    전역

    외부 애플리케이션 부하 분산기와 리전 간 내부 애플리케이션 부하 분산기의 경우 다음 명령어를 사용합니다.

    gcloud network-security server-tls-policies import SERVER_TLS_POLICY_NAME \
      --source=server_tls_policy.yaml \
      --location=global
    

    리전

    리전 외부 애플리케이션 부하 분산기와 리전 내부 애플리케이션 부하 분산기의 경우 다음 명령어를 사용합니다.

    gcloud network-security server-tls-policies import SERVER_TLS_POLICY_NAME \
      --source=server_tls_policy.yaml \
      --location=REGION
    

자세한 내용은 MTLS 클라이언트 검증 모드를 참조하세요.

중간 인증서로 클라이언트 키 서명

이 섹션에서는 리프 인증서를 생성하는 추가 구성 옵션을 제공합니다. 중간 인증서(int.certint.key)를 사용하여 이미 TrustConfig 리소스를 만든 경우 다음 안내를 따르세요.

  1. 클라이언트 키 구성 파일을 만듭니다.

    cat > client.config << EOF
    [req]
    default_bits              = 2048
    req_extensions            = extension_requirements
    distinguished_name        = dn_requirements
    prompt                    = no
    
    [extension_requirements]
    basicConstraints          = critical, CA:FALSE
    keyUsage                  = critical, nonRepudiation, digitalSignature, keyEncipherment
    extendedKeyUsage          = clientAuth
    
    [dn_requirements]
    countryName               = US
    stateOrProvinceName       = California
    localityName              = San Francisco
    0.organizationName        = example
    organizationalUnitName    = test
    commonName                = test.example.com
    emailAddress              = test@example.com
    
    EOF
    

    SPIFFE ID를 연결하려면 다음 안내를 따르세요.

    • 다음과 같이 [extension_requirements] 섹션에 subjectAltName을 추가합니다.

      subjectAltName            = @sans_list
      
    • client.config 파일 하단에 다음 내용으로 새 섹션을 추가합니다.

      [sans_list]
      URI.1                     = spiffe://example.com/test-identity
      
  2. 키에 서명합니다.

    openssl req -new -keyout client.key -out client.csr -config client.config
    
    openssl x509 -req -in client.csr -out client.cert -extfile client.config -extensions extension_requirements -days 365 -CA int.cert -CAkey int.key
    
  3. 테스트하려면 부하 분산기의 IP 주소로 curl 요청을 보냅니다.

    curl -v -k --key client.key --cert client.cert https://IP_ADDRESS
    

    IP_ADDRESS를 부하 분산기의 IP 주소로 바꿉니다.

다음 단계