DNS 승인을 사용하여 전역 Google 관리형 인증서 배포


이 튜토리얼에서는 DNS 승인을 예시로 사용하여 Google 관리형 인증서를 사용하는 인증서 배포 프로세스를 안내합니다.

다음 부하 분산기에서는 DNS 승인을 통해 Google 관리형 인증서를 지원합니다.

  • 전역 외부 애플리케이션 부하 분산기
  • 기본 애플리케이션 부하 분산기
  • 리전 간 내부 애플리케이션 부하 분산기
  • 전역 외부 프록시 네트워크 부하 분산기

지원되는 도메인 승인 유형 비교는 도메인 승인을 참조하세요.

기존 인증서를 인증서 관리자로 마이그레이션하려면 인증서 관리자로 인증서 마이그레이션의 단계를 따르세요.

목표

이 튜토리얼에서는 다음 작업을 완료하는 방법을 보여줍니다.

  • 인증서 관리자를 사용하여 DNS 승인을 통해 공개적으로 신뢰할 수 있는 인증 기관에서 발급한 Google 관리형 인증서를 만듭니다.
  • 대상 HTTPS 프록시를 사용하여 지원되는 부하 분산기에 인증서를 배포합니다.

인증서 배포 프로세스에 대한 자세한 내용은 배포 개요를 참조하세요.

시작하기 전에

  1. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  2. 인증서를 배포하려면 gcloud CLI 버전 465.0.0 이상이 필요합니다. 다음 명령어를 실행하여 gcloud CLI 버전을 확인합니다.

    gcloud --version
    
  3. gcloud CLI를 업데이트하려면 다음 명령어를 실행합니다.

    gcloud components update
    
  4. 이 튜토리얼의 태스크를 완료하려면 다음 역할이 부여되었는지 확인하세요.

    • 인증서 관리자 소유자: 인증서 관리자 리소스를 만들고 관리하는 데 필요합니다.
    • Compute 부하 분산기 관리자 또는 Compute 네트워크 관리자: HTTPS 대상 프록시를 만들고 관리하는 데 필요합니다.
    • DNS 관리자: Cloud DNS를 DNS 솔루션으로 사용하려는 경우에 필요합니다.

    자세한 내용은 다음을 참조하세요.

DNS 승인을 사용하여 Google 관리 인증서를 만듭니다.

이 섹션의 단계를 완료하여 DNS 승인을 만들고 해당 DNS 승인을 참조하는 Google 관리형 인증서를 만듭니다.

DNS 승인 만들기

이 섹션에 설명된 대로 DNS 승인을 만듭니다. *.myorg.example.com과 같이 와일드 카드 인증서에 DNS 승인을 만드는 경우 상위 도메인에 대한 DNS 승인을 구성합니다(예: myorg.example.com).

gcloud

gcloud certificate-manager dns-authorizations create AUTHORIZATION_NAME \
   --domain="DOMAIN_NAME"
gcloud certificate-manager dns-authorizations describe AUTHORIZATION_NAME

프로젝트별 DNS 승인(미리보기)을 사용하려면 다음 명령어를 실행합니다.

gcloud certificate-manager dns-authorizations create AUTHORIZATION_NAME \
   --domain="DOMAIN_NAME" \
   --type="PER_PROJECT_RECORD"
gcloud certificate-manager dns-authorizations describe AUTHORIZATION_NAME

다음을 바꿉니다.

  • AUTHORIZATION_NAME: DNS 승인 이름입니다.
  • DOMAIN_NAME: 이 DNS 승인을 만들 도메인의 이름입니다. 도메인 이름은 myorg.example.com과 같은 정규화된 도메인 이름이어야 합니다.

이 명령어는 다음과 유사한 출력을 반환합니다. 출력의 CNAME 레코드를 사용하여 DNS 구성에 추가합니다.

createTime: '2022-01-14T13:35:00.258409106Z'
dnsResourceRecord:
data: 0e40fc77-a37d-4eb8-8fe1-eea2e18d12d9.4.authorize.certificatemanager.goog.
name: _acme-challenge.myorg.example.com.
type: CNAME
domain: myorg.example.com
name: projects/myProject/locations/global/dnsAuthorizations/myAuthorization
updateTime: '2022-01-14T13:35:01.571086137Z'

Terraform

DNS 승인을 만들려면 google_certificate_manager_dns_authorization 리소스를 사용하면 됩니다.

resource "google_certificate_manager_dns_authorization" "default" {
  name        = "${local.name}-dnsauth-${random_id.tf_prefix.hex}"
  description = "The default dns auth"
  domain      = local.domain
  labels = {
    "terraform" : true
  }
}

Terraform 구성을 적용하거나 삭제하는 방법은 기본 Terraform 명령어를 참조하세요.

DNS 구성에 CNAME 레코드 추가

Google Cloud를 사용하여 DNS를 관리하는 경우 이 섹션의 단계를 완료합니다. 그 외의 경우에는 타사 DNS 솔루션 문서를 참조하세요.

이 섹션의 단계를 완료하기 전에 공개 DNS 영역을 만들었는지 확인합니다.

DNS 승인을 만들면 gcloud CLI 명령어에서 해당 CNAME 레코드를 반환합니다. 다음과 같이 대상 도메인의 DNS 영역에 있는 DNS 구성에 이 CNAME 레코드를 추가해야 합니다.

gcloud

  1. DNS 레코드 트랜잭션을 시작합니다.
  gcloud dns record-sets transaction start --zone="DNS_ZONE_NAME"

DNS_ZONE_NAME을 대상 DNS 영역 이름으로 바꿉니다.

  1. 대상 DNS 영역에 CNAME 레코드를 추가합니다.
  gcloud dns record-sets transaction add CNAME_RECORD \
      --name="_acme-challenge.DOMAIN_NAME." \
      --ttl="30" \
      --type="CNAME" \
      --zone="DNS_ZONE_NAME"

다음을 바꿉니다.

  • CNAME_RECORD: 해당 DNS 승인을 만든 Google Cloud CLI 명령어에서 반환한 CNAME 레코드의 전체 데이터 값입니다.
  • DOMAIN_NAME: 대상 도메인 이름입니다. 도메인 이름은 myorg.example.com과 같은 정규화된 도메인 이름이어야 합니다. 대상 도메인 이름 뒤에 후행 마침표도 포함해야 합니다.
  • DNS_ZONE_NAME: 대상 DNS 영역 이름입니다.

아래 예시를 참조하세요.

  gcloud dns record-sets transaction add 0e40fc77-a37d-4eb8-8fe1-eea2e18d12d9.4.authorize.certificatemanager.goog. \
      --name="_acme-challenge.myorg.example.com." \
      --ttl="30" \
      --type="CNAME" \
      --zone="myorg-example-com"
  
  1. DNS 레코드 트랜잭션을 실행하여 변경사항을 저장합니다.
  gcloud dns record-sets transaction execute --zone="DNS_ZONE_NAME"
  

DNS_ZONE_NAME을 대상 DNS 영역 이름으로 바꿉니다.

Terraform

CNAME 레코드를 DNS 구성에 추가하려면 google_dns_record_set 리소스를 사용하면 됩니다.

resource "google_dns_record_set" "cname" {
  name         = google_certificate_manager_dns_authorization.default.dns_resource_record[0].name
  managed_zone = google_dns_managed_zone.default.name
  type         = google_certificate_manager_dns_authorization.default.dns_resource_record[0].type
  ttl          = 300
  rrdatas      = [google_certificate_manager_dns_authorization.default.dns_resource_record[0].data]
}

DNS 승인을 참조하는 Google 관리형 인증서 만들기

이전 단계에서 만든 DNS 승인을 참조하는 Google 관리형 인증서를 만들려면 다음을 실행합니다.

gcloud

전역 외부 애플리케이션 부하 분산기, 기본 애플리케이션 부하 분산기 또는 전역 외부 프록시 네트워크 부하 분산기:

다음 명령어를 실행합니다.

gcloud certificate-manager certificates create CERTIFICATE_NAME \
   --domains=DOMAIN_NAME \
   --dns-authorizations=AUTHORIZATION_NAME

다음을 바꿉니다.

  • CERTIFICATE_NAME: 인증서의 고유한 이름입니다.
  • DOMAIN_NAME: 인증서의 대상 도메인입니다. 도메인 이름은 myorg.example.com과 같은 정규화된 도메인 이름이어야 합니다.
  • AUTHORIZATION_NAME: 이 인증서에 만든 DNS 승인의 이름입니다.

와일드 카드 도메인 이름으로 Google 관리형 인증서를 만들려면 다음 명령어를 사용합니다. 와일드 카드 도메인 이름 인증서는 지정된 도메인의 모든 첫 번째 수준 하위 도메인을 포함합니다.

gcloud certificate-manager certificates create CERTIFICATE_NAME \
   --domains="*.DOMAIN_NAME,DOMAIN_NAME" \
   --dns-authorizations=AUTHORIZATION_NAME

다음을 바꿉니다.

  • CERTIFICATE_NAME: 인증서의 고유한 이름입니다.
  • DOMAIN_NAME: 인증서의 대상 도메인입니다. 별표 점 프리픽스(*.)는 와일드 카드 인증서를 나타냅니다. 도메인 이름은 myorg.example.com과 같은 정규화된 도메인 이름이어야 합니다.
  • AUTHORIZATION_NAME: 이 인증서에 만든 DNS 승인의 이름입니다.

리전 간 내부 애플리케이션 부하 분산기:

다음 명령어를 실행합니다.

gcloud certificate-manager certificates create CERTIFICATE_NAME \
    --domains=DOMAIN_NAME \
    --dns-authorizations=AUTHORIZATION_NAME \
    --scope=all-regions

다음을 바꿉니다.

  • CERTIFICATE_NAME: 인증서의 고유한 이름입니다.
  • DOMAIN_NAME: 인증서의 대상 도메인입니다. 도메인 이름은 myorg.example.com과 같은 정규화된 도메인 이름이어야 합니다.
  • AUTHORIZATION_NAME: 이 인증서에 만든 DNS 승인의 이름입니다.

와일드 카드 도메인 이름으로 Google 관리형 인증서를 만들려면 다음 명령어를 사용합니다. 와일드 카드 도메인 이름 인증서는 지정된 도메인의 모든 첫 번째 수준 하위 도메인을 포함합니다.

gcloud certificate-manager certificates create CERTIFICATE_NAME \
    --domains="*.DOMAIN_NAME,DOMAIN_NAME" \
    --dns-authorizations=AUTHORIZATION_NAME \
    --scope=all-regions

다음을 바꿉니다.

  • CERTIFICATE_NAME: 인증서의 고유한 이름입니다.
  • DOMAIN_NAME: 인증서의 대상 도메인입니다. 별표 점 프리픽스(*.)는 와일드 카드 인증서를 나타냅니다. 도메인 이름은 myorg.example.com과 같은 정규화된 도메인 이름이어야 합니다.
  • AUTHORIZATION_NAME: 이 인증서에 만든 DNS 승인의 이름입니다.

Terraform

google_certificate_manager_certificate 리소스를 사용합니다.

resource "google_certificate_manager_certificate" "root_cert" {
  name        = "${local.name}-rootcert-${random_id.tf_prefix.hex}"
  description = "The wildcard cert"
  managed {
    domains = [local.domain, "*.${local.domain}"]
    dns_authorizations = [
      google_certificate_manager_dns_authorization.default.id
    ]
  }
  labels = {
    "terraform" : true
  }
}

인증서가 활성 상태인지 확인

다음 명령어를 사용하여 부하 분산기에 배포하기 전에 인증서 자체가 활성 상태인지 확인합니다. 인증서 상태가 ACTIVE로 변경되는 데 몇 시간이 걸릴 수 있습니다.

gcloud certificate-manager certificates describe CERTIFICATE_NAME

CERTIFICATE_NAME을 대상 Google 관리형 인증서의 이름으로 바꿉니다.

이 명령어는 다음과 유사한 출력을 반환합니다.

expireTime: '2022-05-07T05:03:49Z'
managed:
  authorizationAttemptInfo:
  -   domain: myorg.example.com
    state: AUTHORIZED
  dnsAuthorizations:
  -   projects/my-project/locations/global/dnsAuthorizations/myAuth
  domains:
  -   myorg.example.com
  state: ACTIVE
name: projects/myProject/locations/global/certificates/myCert
pemCertificate: |
  -----BEGIN CERTIFICATE-----
  [...]
  -----END CERTIFICATE-----
sanDnsnames:
-   myorg.example.com
updateTime: '2021-10-20T12:19:55.083385630Z'

부하 분산기에 인증서 배포

이 섹션에서는 Google 관리형 인증서를 부하 분산기에 배포하는 데 필요한 단계를 설명합니다.

이 섹션의 태스크를 진행하기 전에 DNS 승인을 사용하여 Google 관리 인증서 만들기 섹션에 나와 있는 태스크를 완료했는지 확인합니다.

부하 분산기 유형에 따라 다음과 같이 인증서를 배포할 수 있습니다.

인증서 맵을 사용하여 인증서 배포

이 섹션에서는 인증서 맵을 사용하여 인증서를 배포하는 단계를 설명합니다.

인증서 맵 만들기

인증서와 연결된 인증서 맵 항목을 참조하는 인증서 맵을 만듭니다.

gcloud

gcloud certificate-manager maps create CERTIFICATE_MAP_NAME

CERTIFICATE_MAP_NAME을 대상 인증서 맵의 이름으로 바꿉니다.

Terraform

인증서 맵을 만들려면 google_certificate_manager_certificate_map 리소스를 사용하면 됩니다.

resource "google_certificate_manager_certificate_map" "certificate_map" {
  name        = "${local.name}-certmap-${random_id.tf_prefix.hex}"
  description = "${local.domain} certificate map"
  labels = {
    "terraform" : true
  }
}

인증서 맵 항목 만들기

인증서 맵 항목을 만들고 인증서인증서 맵과 연결합니다.

gcloud

gcloud certificate-manager maps entries create CERTIFICATE_MAP_ENTRY_NAME \
   --map="CERTIFICATE_MAP_NAME" \
   --certificates="CERTIFICATE_NAME" \
   --hostname="HOSTNAME"

다음을 바꿉니다.

  • CERTIFICATE_MAP_ENTRY_NAME: 인증서 맵 항목의 고유한 이름
  • CERTIFICATE_MAP_NAME: 이 인증서 맵 항목이 연결된 인증서 맵의 이름
  • CERTIFICATE_NAME: 이 인증서 맵 항목에 연결하려는 인증서의 이름
  • HOSTNAME: 이 인증서 맵 항목과 연결하려는 호스트 이름

Terraform

인증서 맵 항목을 만들려면 google_certificate_manager_certificate_map_entry 리소스를 사용하면 됩니다.

resource "google_certificate_manager_certificate_map_entry" "first_entry" {
  name        = "${local.name}-first-entry-${random_id.tf_prefix.hex}"
  description = "example certificate map entry"
  map         = google_certificate_manager_certificate_map.certificate_map.name
  labels = {
    "terraform" : true
  }
  certificates = [google_certificate_manager_certificate.root_cert.id]
  hostname     = local.domain
}

인증서 맵 항목이 활성 상태인지 확인

다음 명령어를 사용하여 해당 인증서 맵을 대상 프록시에 연결하기 전에 인증서 맵 항목이 활성 상태인지 확인합니다.

gcloud certificate-manager maps entries describe CERTIFICATE_MAP_ENTRY_NAME \
    --map="CERTIFICATE_MAP_NAME"

다음을 바꿉니다.

  • CERTIFICATE_MAP_ENTRY_NAME: 대상 인증서 맵 항목 이름
  • CERTIFICATE_MAP_NAME: 이 인증서 맵 항목이 연결된 인증서 맵의 이름

이 명령어는 다음과 유사한 출력을 반환합니다.

certificates:
createTime: '2021-09-06T10:01:56.229472109Z'
hostname: example.com
name: projects/my-project/locations/global/certificateMaps/myCertMap/certificateMapEntries/myCertMapEntry
state: ACTIVE
updateTime: '2021-09-06T10:01:58.277031787Z'

대상 프록시에 인증서 맵 연결

구성된 인증서 맵을 대상 프록시에 연결합니다.

gcloud

  1. Google Cloud 콘솔에서 대상 프록시 페이지로 이동합니다.

    대상 프록시로 이동

  2. 대상 프록시의 이름을 확인합니다.

  3. 인증서 맵을 대상 프록시에 연결합니다.

  gcloud compute target-https-proxies update PROXY_NAME \
      --certificate-map="CERTIFICATE_MAP_NAME" \
      --global
  

다음을 바꿉니다.

  • PROXY_NAME: 대상 프록시 이름
  • CERTIFICATE_MAP_NAME: 인증서 맵 항목과 연결된 인증서를 참조하는 인증서 맵의 이름

Terraform

인증서 맵을 대상 프록시에 연결하려면 google_compute_target_https_proxy 리소스를 사용하면 됩니다.

기존 TLS(SSL) 인증서가 프록시에 직접 연결되어 있으면 프록시는 직접 연결된 TLS(SSL) 인증서보다 인증서 맵에서 참조하는 인증서를 우선시합니다.

대상 프록시에 인증서 직접 연결

인증서를 프록시에 직접 연결하려면 다음 명령어를 실행합니다.

gcloud compute target-https-proxies update PROXY_NAME \
    --url-map=URL_MAP \
    --global \
    --certificate-manager-certificates=CERTIFICATE_NAME

다음을 바꿉니다.

  • PROXY_NAME: 프록시의 고유한 이름
  • URL_MAP: URL 맵의 이름입니다. 부하 분산기를 만들 때 URL 맵을 만들었습니다.
  • CERTIFICATE_NAME: 인증서의 이름입니다.

삭제

이 튜토리얼의 변경사항을 되돌리려면 다음 단계를 완료합니다.

  1. 인증서 맵을 프록시에서 분리합니다.

    인증서 맵을 분리하기 전에 다음 사항에 유의하세요.

    • 프록시에 직접 연결된 TLS(SSL) 인증서가 있는 경우 인증서 맵을 분리하면 프록시가 직접 연결된 TLS(SSL) 인증서를 사용하여 프록시를 다시 시작합니다.
    • 프록시에 직접 연결된 TLS(SSL) 인증서가 없으면 인증서 맵을 프록시에서 분리할 수 없습니다. 인증서 맵을 분리하려면 먼저 TLS(SSL) 인증서 최소 하나 이상을 프록시에 직접 연결해야 합니다.

    인증서 맵을 분리하려면 다음 명령어를 실행합니다.

    gcloud compute target-https-proxies update PROXY_NAME \
       --clear-certificate-map
    

    PROXY_NAME을 대상 프록시의 이름으로 바꿉니다.

  2. 인증서 맵에서 인증서 맵 항목을 삭제합니다.

    gcloud certificate-manager maps entries delete CERTIFICATE_MAP_ENTRY_NAME \
       --map="CERTIFICATE_MAP_NAME"
    

    다음을 바꿉니다.

    • CERTIFICATE_MAP_ENTRY_NAME: 대상 인증서 맵 항목 이름
    • CERTIFICATE_MAP_NAME: 대상 인증서 맵 이름
  3. 인증서 맵을 삭제합니다.

    gcloud certificate-manager maps delete CERTIFICATE_MAP_NAME
    

    CERTIFICATE_MAP_NAME을 대상 인증서 맵의 이름으로 바꿉니다.

  4. Google 관리형 인증서를 삭제합니다.

    gcloud certificate-manager certificates delete CERTIFICATE_NAME
    

    CERTIFICATE_NAME을 대상 인증서의 이름으로 바꿉니다.

  5. DNS 승인을 삭제합니다.

    gcloud certificate-manager dns-authorizations delete AUTHORIZATION_NAME
    

    AUTHORIZATION_NAME을 대상 DNS 승인 이름으로 바꿉니다.

다음 단계