Certificate Managerでの証明書のデプロイ

## 目的
CertficateManagerを用いてマネージド証明書を発行し、ロードバランサにデプロイする
最後に作成したマップと証明書を削除して完了

## Certificate Managerの導入
セキュリティ -> Certificate Managerへ移動する
GUI操作では実施できないようなので、gcloudコマンドにて実施する
![貼り付けた画像_2023_09_05_15_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/87096bd7-aa13-4e94-34b2-047abd465aea.png)

CloudShellからワイルドカード証明書を発行する
-> 発行する証明書：*.xcloudyx.net

ドメインの所有者を証明するため、DNSによる所有者確認を実施する
-> 認証方式：DNS認証

### DNS認証の準備
参考URL:[DNS 認証を作成する](https://cloud.google.com/certificate-manager/docs/dns-authorizations?hl=ja#auth-create)
コマンド：gcloud certificate-manager dns-authorizations create AUTHORIZATION_NAME \
     --domain="DOMAIN_NAME"

AUTHORIZATION_NAMEは、DNS認証を説明する一意の名前
DOMAIN_NAMEは DNS認証を作成するドメインの名前

以下は、xcloudyxcertというAUTHORIZATION_NAMEとし、証明書の発行先を*.xcloudyx.netとした例
```
cloudshell$ gcloud certificate-manager dns-authorizations create xcloudyxcert --domain="xcloudyx.net"
Create request issued for: [xcloudyxcert]
Waiting for operation [projects/generative-ai-396008/locations/global/operations/operation-1693895544538-60496ca380581-bf15f192-077385d2] to complete...done.                                                
Created dnsAuthorization [xcloudyxcert].
```

DNS認証のため、xcloudyx.netのネームサーバ（NS)に登録する情報を確認する
コマンド:gcloud certificate-manager dns-authorizations describe AUTHORIZATION_NAME

以下は、xcloudyxcertの情報を表示
```
cloudshell$ gcloud certificate-manager dns-authorizations describe xcloudyxcert
createTime: '2023-09-05T06:32:24.587520999Z'
dnsResourceRecord:
  data: c84f2978-8437-454e-95c9-fe41a8ac31db.10.authorize.certificatemanager.goog.
  name: _acme-challenge.xcloudyx.net.
  type: CNAME
domain: xcloudyx.net
name: projects/generative-ai-xxxxxx/locations/global/dnsAuthorizations/xcloudyxcert
updateTime: '2023-09-05T06:32:25.274569446Z'
```

### DNSレコードの追加
CloudDNSに登録した例
![貼り付けた画像_2023_09_05_15_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/caca13a9-1cd7-3c41-faef-abc03d81624d.png)

### 証明書の発行
なぜか公式に作成のコマンドではなく更新しか書いていなかったが、createで実施する
[DNS 認証を更新する](https://cloud.google.com/certificate-manager/docs/dns-authorizations?hl=ja#update_a_dns_authorization)

```
cloudshell$ gcloud certificate-manager certificates create wild-xcloudyx-cert --domains="*.xcloudyx.net" --dns-authorizations=xcloudyxcert
Create request issued for: [wild-xcloudyx-cert]
Waiting for operation [projects/generative-ai-396008/locations/global/operations/operation-1693966087221-604a736e3f181-277fac45-a9659a91] to complete...done.                      
Created certificate [wild-xcloudyx-cert].
```

発行状況の確認、まだ作成中
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/860eacfa-7029-db4f-0f91-3667008f65df.png)

```
cloudshell$ gcloud certificate-manager certificates describe wild-xcloudyx-cert
createTime: '2023-09-06T02:08:07.315172254Z'
managed:
  authorizationAttemptInfo:
  - domain: '*.xcloudyx.net'
    state: AUTHORIZING
  dnsAuthorizations:
  - projects/285464393872/locations/global/dnsAuthorizations/xcloudyxcert
  domains:
  - '*.xcloudyx.net'
  state: PROVISIONING
name: projects/generative-ai-396008/locations/global/certificates/wild-xcloudyx-cert
sanDnsnames:
- '*.xcloudyx.net'
updateTime: '2023-09-06T02:08:07.795064057Z'
```

しばらく待っていると、certificate managerのコンソールで作成が完了している
![貼り付けた画像_2023_09_06_11_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/f84bb9e8-3301-50d2-2a27-7becff23fe98.png)

## 証明書のデプロイ -> ロードバランサ

### Certificate Mapの作成
[証明書をロードバランサにデプロイする](https://cloud.google.com/certificate-manager/docs/deploy-google-managed-dns-auth?hl=ja#deploy_the_certificate_to_a_load_balancer)

コマンド：gcloud certificate-manager maps create CERTIFICATE_MAP_NAME

CERTIFICATE_MAP_NAMEは、ターゲット証明書マップの名前

```
cloudshell$ gcloud certificate-manager maps create certmap
Waiting for 'operation-1693965405419-604a70e40770f-179c67fa-43ecc718' to complete...done.                                                                               
Created certificate map [certmap].
```

### MapEntryの作成
[証明書マップエントリを作成する](https://cloud.google.com/certificate-manager/docs/deploy-google-managed-dns-auth?hl=ja#create_a_certificate_map_entry)

コマンド：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は、この証明書マップエントリに関連付けるホスト名

```
cloudshell$ gcloud certificate-manager maps entries create mapentry --hostname=www.xcloudyx.net --map=certmap --certificates=wild-xcloudyx-cert 
Waiting for 'operation-1693966948109-604a76a340bb6-d6b36f24-71c8ac23' to complete...done.                                                                                          
Created certificate map entry [mapentry].
```

MapEntryの確認
```
cloudshell$ gcloud certificate-manager maps entries describe mapentry --map=certmap
certificates:
- projects/285464393872/locations/global/certificates/wild-xcloudyx-cert
createTime: '2023-09-06T02:22:28.190060610Z'
hostname: www.xcloudyx.net
name: projects/generative-ai-396008/locations/global/certificateMaps/certmap/certificateMapEntries/mapentry
state: PENDING
updateTime: '2023-09-06T02:22:28.580995699Z'
```

### ターゲットプロキシの証明書更新
既存のロードバランサに適用されている証明書を、CertificateManagerにある証明書で置き換える

現状の状態、"cert"という証明書がわり当たっている
![貼り付けた画像_2023_09_06_14_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/b2e2c256-eb63-73a7-4e2c-9c86945a7070.png)

コマンド:gcloud compute target-https-proxies update PROXY_NAME \
 --certificate-map="CERTIFICATE_MAP_NAME"

PROXY_NAMEは、ターゲットプロキシの名前
CERTIFICATE_MAP_NAMEは、証明書マップエントリとそれに関連付けられた証明書を参照する証明書マップの名前

```
cloudshell$ gcloud compute target-https-proxies update serverless-lb-target-proxy --certificate-map=certmap 
Updated [https://www.googleapis.com/compute/v1/projects/generative-ai-396008/global/targetHttpsProxies/serverless-lb-target-proxy].
```
更新後のターゲットプロキシ

正しく"certmap"に更新された
![貼り付けた画像_2023_09_06_14_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/079c25fe-272d-9863-d2f4-5dffc22bc95d.png)

## 証明書の削除
証明書の削除にはmap,mapentryの削除を実施した上で、証明書の削除が必要

[クリーンアップ](https://cloud.google.com/certificate-manager/docs/deploy-google-managed-dns-auth?hl=ja#clean_up)

マップエントリの削除
```
cloudshell$ gcloud certificate-manager maps entries delete mapentry --map=certmap 
You are about to delete certificate map entry 'mapentry' from certificate map 'certmap'

Do you want to continue (Y/n)?  Y

Waiting for 'operation-1693979758698-604aa65c61fca-35704edd-cac7e4db' to complete...done.                                                                                                                    
Deleted map entry [mapentry].
```

マップの削除
```
cloudshell$ gcloud certificate-manager maps delete certmap                                                                                                            
You are about to delete certificate map 'certmap'

Do you want to continue (Y/n)?  Y

Waiting for 'operation-1693979767884-604aa665249a1-e9835332-f59791b7' to complete...done.                                                                                                                    
Deleted map [certmap].
```

証明書の削除
```
cloudshell$ gcloud certificate-manager certificates delete wild-xcloudyx-cert                                                                                         
You are about to delete certificate 'wild-xcloudyx-cert'

Do you want to continue (Y/n)?  Y

Waiting for 'operation-1693979781963-604aa67291dbe-a3d41679-76159aaa' to complete...done.                                                                                                                    
Deleted certificate [wild-xcloudyx-cert].
```