部署全球性 Google 代管憑證,並透過 DNS 授權


本教學課程說明如何使用憑證管理工具,透過 DNS 授權部署全球 Google 代管憑證。

下列全球負載平衡器支援使用 DNS 授權的 Google 代管憑證:

  • 全域外部應用程式負載平衡器
  • 傳統版應用程式負載平衡器
  • 全域外部 Proxy 網路負載平衡器

如果您想部署至跨區域負載平衡器或區域性負載平衡器,請參閱下列文章:

目標

本教學課程將說明如何完成下列工作:

  • 使用憑證管理工具,建立由公開信任的憑證授權單位核發的 Google 代管憑證,並透過 DNS 授權。
  • 使用目標 HTTPS Proxy,將憑證部署至支援的負載平衡器。

事前準備

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Compute Engine, Certificate Manager APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  7. To initialize the gcloud CLI, run the following command:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  9. Make sure that billing is enabled for your Google Cloud project.

  10. Enable the Compute Engine, Certificate Manager APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  13. To initialize the gcloud CLI, run the following command:

    gcloud init
  14. 建立公開 DNS 區域
  15. 必要的角色

    請確認您具備下列角色,才能完成本教學課程中的任務:

    • Certificate Manager 擁有者 (roles/certificatemanager.owner)

      建立及管理 Certificate Manager 資源時必須使用。

    • Compute 負載平衡器管理員 (roles/compute.loadBalancerAdmin) 或 Compute 網路管理員 (roles/compute.networkAdmin)

      建立及管理 HTTPS 目標 Proxy 時必須使用。

    • DNS 管理員 (roles/dns.admin)

      如要將 Cloud DNS 做為 DNS 解決方案,就必須提供這項資訊。

    如要瞭解詳情,請參考下列資源:

    網域名稱

    如要建立憑證,請取得您擁有的網域的完整網域名稱 (FQDN)。如果沒有網域,可以使用 Cloud Domains 註冊網域

    建立負載平衡器

    本教學課程假設您已建立並設定負載平衡器的後端、健康狀態檢查、後端服務和網址對應。如果您已建立外部應用程式負載平衡器,請記下網址對應項目的名稱,因為您稍後會在本教學課程中使用這項資訊。

    如果您尚未建立負載平衡器,請參閱下列頁面瞭解如何建立負載平衡器:

建立具備 DNS 授權的 Google 代管憑證

建立憑證前,請先建立公開 DNS 可用區。接著,請建立 DNS 授權,並將 CNAME 記錄新增至目標 DNS 區域。

建立 DNS 授權

DNS 授權僅涵蓋單一網域名稱。您必須為要與目標憑證搭配使用的每個網域名稱,分別建立 DNS 授權。

如果您要為萬用字元憑證 (例如 *.myorg.example.com) 建立 DNS 授權,請為父網域設定 DNS 授權,例如 myorg.example.com

主控台

您可以在建立憑證時建立 DNS 授權或附加現有的 DNS 授權。詳情請參閱「建立參照 DNS 授權的 Google 代管憑證」。

gcloud

如要建立 DNS 授權,請使用 certificate-manager dns-authorizations create 指令

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

更改下列內容:

  • AUTHORIZATION_NAME:DNS 授權的名稱。
  • DOMAIN_NAME:您要建立 DNS 授權的目標網域名稱。網域名稱必須是完整的網域名稱,例如 myorg.example.com

全球 Google 代管憑證會使用 FIXED_RECORD 做為預設 DNS 授權類型。如要使用 PER_PROJECT_RECORD DNS 授權,請執行下列指令:

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

建立 DNS 授權後,請使用 certificate-manager dns-authorizations describe 指令驗證:

gcloud certificate-manager dns-authorizations describe AUTHORIZATION_NAME \

輸出結果大致如下。在輸出內容中找出 dnsResourceRecord 行,並取得 CNAME 記錄 (datanametype),將其加入 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 指令」。

API

如要建立 DNS 授權,請對 dnsAuthorizations.create 方法發出 POST 要求:

POST /v1/projects/PROJECT_ID/locations/global/dnsAuthorizations?dns_authorization_id=AUTHORIZATION_NAME"
{
  "domain": "DOMAIN_NAME",
  "type": "PER_PROJECT_RECORD" //optional
}

更改下列內容:

  • PROJECT_ID: Google Cloud 專案的 ID。
  • AUTHORIZATION_NAME:DNS 授權的名稱。
  • DOMAIN_NAME:您要建立 DNS 授權的目標網域名稱。網域名稱必須是完整的網域名稱,例如 myorg.example.com

建立參照 DNS 授權的 Google 代管憑證

如要建立參照您在前幾個步驟中建立的 DNS 授權的 Google 管理憑證,請按照下列步驟操作:

主控台

  1. 前往 Google Cloud 控制台的「Certificate Manager」頁面。

    前往 Certificate Manager

  2. 在「憑證」分頁中,按一下「新增憑證」

  3. 在「憑證名稱」欄位中,輸入憑證的專屬名稱。

  4. 選用:在「說明」欄位中輸入證書的說明。您可以透過說明辨識憑證。

  5. 在「Location」(位置) 部分,選取「Global」

  6. 在「範圍」部分,選取「預設」

  7. 在「憑證類型」中,選取「建立 Google 代管憑證」

  8. 在「憑證授權單位類型」中,選取「公開」

  9. 在「網域名稱」欄位中,指定以半形逗號分隔的憑證網域名稱清單。每個網域名稱都必須是完整的網域名稱,例如 myorg.example.com。網域名稱也可以是萬用字元網域名稱,例如 *.example.com

  10. 在「授權類型」中,選取「DNS 授權」

    這個頁面會列出網域名稱的 DNS 授權。如果網域名稱沒有相關的 DNS 授權,請按照下列步驟建立:

    1. 按一下「建立缺少的 DNS 授權」
    2. 在「DNS 授權名稱」欄位中,指定 DNS 授權名稱。預設的 DNS 授權類型為 FIXED_RECORD。如要個別管理多個專案的憑證,請勾選「Per project authorization」核取方塊。
    3. 按一下「建立 DNS 授權」
  11. 在「Labels」欄位中,指定要與憑證建立關聯的標籤。如要新增標籤,請按一下 「Add label」,然後指定標籤的鍵和值。

  12. 按一下 [建立]。

    新的憑證會顯示在憑證清單中。

gcloud

如要建立 DNS 授權的全球 Google 代管憑證,請搭配 dns-authorizations 標記執行 certificate-manager certificates create 指令

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

更改下列內容:

  • CERTIFICATE_NAME:憑證名稱。
  • DOMAIN_NAME:目標網域的名稱。網域名稱必須是完整網域名稱,例如 myorg.example.com,或是萬用字元網域,例如 *.myorg.example.com。星號點前置字串 (*.) 代表萬用字元憑證。
  • AUTHORIZATION_NAMES:以半形逗號分隔的清單,列出您為憑證建立的 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
  }
}

API

如要建立憑證,請對 certificates.create 方法發出 POST 要求,如下所示:

POST /v1/projects/PROJECT_ID/locations/global/certificates?certificate_id=CERTIFICATE_NAME
{
 "managed": {
  "domains": ["DOMAIN_NAME"],
  "dnsAuthorizations": [
   "projects/PROJECT_ID/locations/global/dnsAuthorizations/AUTHORIZATION_NAME",
  ],
 }
}

更改下列內容:

  • PROJECT_ID: Google Cloud 專案的 ID。
  • CERTIFICATE_NAME:憑證名稱。
  • DOMAIN_NAME:目標網域的名稱。網域名稱必須是完整網域名稱,例如 myorg.example.com,或是萬用字元網域,例如 *.myorg.example.com。星號點前置字串 (*.) 表示萬用字元憑證。
  • AUTHORIZATION_NAMES:以半形逗號分隔的 DNS 授權名稱清單。

在 DNS 設定中新增 CNAME 記錄

如果您使用第三方 DNS 解決方案來管理 DNS,請參閱相關文件,瞭解如何在 DNS 設定中新增 CNAME 記錄。如果您使用Google Cloud 管理 DNS,請完成本節中的步驟。

主控台

如要建立記錄集,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「DNS 區域」頁面。

    前往 Cloud DNS 區域

  2. 按一下要新增記錄的 DNS 區域名稱。

  3. 在「Zone details」(可用區詳細資料) 頁面中,按一下「Add standard」(新增標準)

  4. 在「Create record set」(建立記錄集) 頁面的「DNS name」(DNS 名稱) 欄位中,輸入 DNS 區域的子網域。

    輸入子網域名稱時,請確認子網域名稱 (包括 DNS 名稱欄位中顯示的灰色文字) 與 dnsResourceRecord.name 欄位的完整值相符,gcloud certificate-manager dns-authorizations describe 指令的輸出內容 會顯示這項資訊。

    請參閱以下例子:

    • 如果 dnsResourceRecord.name 欄位值為 _acme-challenge.myorg.example.com.,且「DNS 名稱」欄位中的灰色文字為 .example.com.,請輸入 _acme-challenge.myorg

    • 如果 dnsResourceRecord.name 欄位值為 _acme-challenge.myorg.example.com.,且「DNS 名稱」欄位中的灰色文字為 .myorg.example.com.,請輸入 _acme-challenge

    • 如果 dnsResourceRecord.name 欄位的值為 _acme-challenge_ujmmovf2vn55tgye.myorg.example.com.,且「DNS 名稱」欄位中的灰色文字為 .myorg.example.com.,請輸入 _acme-challenge_ujmmovf2vn55tgye

  5. 在「Resource record type」欄位中選取「CNAME」

  6. 在「TTL」TTL欄位中,針對資源記錄存留時間輸入正值數字,也就是記錄可快取的時間。

  7. 從「TTL 單位」清單中選取時間單位,例如 30 minutes

  8. 在「Canonical name」欄位中,輸入 dnsResourceRecord.data 欄位的完整值,如 gcloud certificate-manager dns-authorizations describe 指令的輸出內容所示。

  9. 如要輸入其他資訊,請按一下「新增項目」

  10. 按一下 [建立]。

gcloud

建立 DNS 授權時,gcloud CLI 指令會傳回對應的 CNAME 記錄。如要在目標網域的 DNS 區域中,將 CNAME 記錄新增至 DNS 設定,請按照下列步驟操作:

  1. 啟動 DNS 記錄交易:

    gcloud dns record-sets transaction start --zone="DNS_ZONE_NAME"
    

    DNS_ZONE_NAME 替換為目標 DNS 區域的名稱。

  2. 將 CNAME 記錄新增至目標 DNS 區域:

    gcloud dns record-sets transaction add CNAME_RECORD \
        --name="VALIDATION_SUBDOMAIN_NAME.DOMAIN_NAME." \
        --ttl="30" \
        --type="CNAME" \
        --zone="DNS_ZONE_NAME"
    

    更改下列內容:

    • CNAME_RECORD:建立對應 DNS 授權的 Google Cloud CLI 指令傳回的 CNAME 記錄完整資料值。
    • VALIDATION_SUBDOMAIN_NAME:DNS 區域的前置子網域,例如 _acme-challenge。您可以從 gcloud certificate-manager dns-authorizations describe 指令記錄複製名稱,如「建立 DNS 授權」一文所述。
    • 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"
    
  3. 執行 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]
}

驗證憑證狀態

將憑證部署至負載平衡器前,請先確認憑證是否處於啟用狀態。憑證狀態可能需要幾分鐘才能變更為 ACTIVE

主控台

  1. 前往 Google Cloud 控制台的「Certificate Manager」頁面。

    前往 Certificate Manager

  2. 在「證照」分頁中,查看證照的「狀態」欄。

gcloud

如要驗證憑證狀態,請執行下列指令:

gcloud certificate-manager certificates describe CERTIFICATE_NAME

CERTIFICATE_NAME 替換為目標 Google 管理憑證的名稱。

輸出結果會與下列內容相似:

createTime: '2021-10-20T12:19:53.370778666Z'
expireTime: '2022-05-07T05:03:49Z'
managed:
  authorizationAttemptInfo:
  - domain: myorg.example.com
    state: AUTHORIZED
  dnsAuthorizations:
    - projects/myProject/locations/global/dnsAuthorizations/myCert
  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'

如果證書狀態在幾小時後仍不是 ACTIVE,請確認您已正確將 CNAME 記錄新增至 DNS 設定。

如需更多疑難排解步驟,請參閱「排解憑證管理工具問題」。

將憑證部署至負載平衡器

如要部署全球 Google 代管憑證,請使用憑證對應關係部署憑證。

建立憑證對應關係

建立憑證對應關係,參照與憑證相關聯的憑證對應項目:

gcloud

如要建立憑證對應,請使用 gcloud certificate-manager maps create 指令

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 指令

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:您要與憑證對應項目建立關聯的主機名稱。

    如果您想建立涵蓋萬用字元網域和根網域的憑證,請使用根網域和萬用字元指定主機名稱,例如 example.com*.example.com。此外,您必須指定兩個憑證對應項目,一個用於 example.com,另一個用於 *.example.com

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
}

如要建立含萬用字元網域的憑證對應項目,請使用 google_certificate_manager_certificate_map_entry 資源

resource "google_certificate_manager_certificate_map_entry" "second_entry" {
  name        = "${local.name}-second-entity-${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}"
}

確認憑證對應項目是否處於啟用狀態

請先確認憑證對應項目是否處於啟用狀態,再將對應的憑證對應項目附加至目標 Proxy。

如要驗證憑證對應項目,請使用 gcloud certificate-manager maps entries describe 指令

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

更改下列內容:

  • CERTIFICATE_MAP_ENTRY_NAME:憑證對應項目的名稱。
  • CERTIFICATE_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'

將憑證對應附加至目標 Proxy

您可以將憑證對應表附加至新的目標 Proxy 或現有目標 Proxy。

gcloud

如要將憑證對應設定附加至新的目標 Proxy,請使用 gcloud compute target-https-proxies create 指令

gcloud compute target-https-proxies create PROXY_NAME \
    --certificate-map="CERTIFICATE_MAP_NAME" \
    --url-map="URL_MAP" \
    --global

更改下列內容:

  • PROXY_NAME:目標 Proxy 的名稱。
  • CERTIFICATE_MAP_NAME:參照憑證對應關係項目和相關憑證的憑證對應關係名稱。
  • URL_MAP:網址對應項目的名稱

如要將憑證對應表附加至現有的目標 HTTPS Proxy,請使用 gcloud compute target-https-proxies update 指令。如果不知道現有目標 Proxy 的名稱,請前往「目標 Proxy」頁面,並記下目標 Proxy 的名稱。

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

建立或更新目標 Proxy 後,請執行下列指令來驗證:

gcloud compute target-https-proxies list

Terraform

如要將憑證對應項目附加至目標 Proxy,您可以使用 google_compute_target_https_proxy 資源

設定目標 Proxy 時,如果您直接附加 TLS (SSL) 憑證,並透過憑證對應附加,Proxy 會使用憑證對應參照的憑證,並忽略直接附加的 TLS (SSL) 憑證。

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取您在本教學課程中使用資源的費用,請將這些資源刪除。

  1. 刪除負載平衡器及其資源。

    請參閱「清除負載平衡器設定」。

  2. 從 Proxy 中刪除或分離憑證對應關係。

    如要刪除憑證對應,請執行下列指令:

    gcloud compute target-https-proxies delete PROXY_NAME
    

    如果您想保留目標 HTTPS Proxy,請將憑證對應項目從 Proxy 中分離。卸除憑證對應前,請注意下列事項:

    • 如果有任何 TLS (SSL) 憑證直接附加至 Proxy,則解除憑證對應會導致 Proxy 恢復使用這些直接附加的 TLS (SSL) 憑證。
    • 如果沒有直接附加至 Proxy 的 TLS (SSL) 憑證,則無法將憑證對應項目從 Proxy 中分離。您必須先將至少一個 TLS (SSL) 憑證直接附加至 Proxy,才能解除憑證對應。

    如要卸除憑證對應,請執行下列指令:

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

    PROXY_NAME 替換為目標 Proxy 的名稱。

  3. 從憑證對應關係中刪除憑證對應項目:

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

    更改下列內容:

    • CERTIFICATE_MAP_ENTRY_NAME:憑證對應項目的名稱。
    • CERTIFICATE_MAP_NAME:憑證對應關係的名稱。
  4. 刪除憑證對應關係:

    gcloud certificate-manager maps delete CERTIFICATE_MAP_NAME
    

    CERTIFICATE_MAP_NAME 替換為憑證對應項目的名稱。

  5. 刪除 Google 代管的憑證:

    主控台

    1. 前往 Google Cloud 控制台的「Certificate Manager」頁面。

      前往 Certificate Manager

    2. 在「憑證」分頁中,選取憑證的核取方塊。

    3. 點選「刪除」。

    4. 在出現的對話方塊中,按一下 [Delete] (刪除) 以進行確認。

    gcloud

    gcloud certificate-manager certificates delete CERTIFICATE_NAME
    

    CERTIFICATE_NAME 替換為目標憑證的名稱。

  6. 刪除 DNS 授權:

    gcloud certificate-manager dns-authorizations delete AUTHORIZATION_NAME
    

    AUTHORIZATION_NAME 替換為 DNS 授權名稱。

後續步驟