TLS 証明書を取得する: 例

このトピックの内容は一例にすぎません。ここでは、TLS 証明書を認証局(CA)の Let's Encrypt から取得する方法について説明します。これは主に、CA によって承認された証明書と鍵のペアを取得する方法が他にない場合に行う手順です。この例では、Let's Encrypt CA、Certbot クライアント、Google Cloud Platform Cloud DNS を使用して証明書を生成する方法を示します。

これらの証明書を使用できる場所

クラスタ外部に公開されている 2 つの Istio Ingress ゲートウェイに TLS 認証情報を指定する必要があります。

ゲートウェイ TLS の要件
ランタイム Ingress ゲートウェイ 自己署名証明書と鍵のペア、または承認済みの TLS 認証情報を使用できます。
MART Ingress ゲートウェイ(Apigee Connect を使用しない場合は省略可) 承認済みの TLS 証明書と鍵のペア、または Kubernetes Secret が必要です。
外部接続もご覧ください。

要件

ドメイン名登録事業者から取得したドメイン名が必要です。Google Domains または他のドメイン登録事業者を通じてドメイン名を登録できます。

Cloud DNS を構成する

承認済みの TLS 認証情報を取得するには、修飾ドメイン名が必要です。Google Cloud DNS を使用してドメイン名を取得し、ドメイン サーバーを管理する手順を次に示します。
  1. Google Cloud コンソールを開き、ステップ 1: Google Cloud アカウントを作成するで作成したアカウントでログインします。
  2. ステップ 2: GCP プロジェクトを作成するで作成したプロジェクトを選択します。
  3. まだ行っていない場合は、Cloud DNS API を有効にします。API の有効化をご覧ください。
  4. 静的 IP アドレスを作成します。
    • GKE をご利用の場合は、静的外部 IP アドレスの予約の手順を実施し、外部プロセスでハイブリッド ランタイム Ingress との通信に使用できる静的 IP アドレスを作成します。アドレスには任意の名前を付けることができます(例: apigee-hybrid-runtime)。完了したら、次のステップのクラスタ構成で IP 番号を使用します(例: 34.66.75.196)。
    • Anthos GKE をご利用の場合は、Anthos GKE ドキュメントの手順で静的 IP アドレスを作成します。
  5. 先ほど予約した外部 IP を取得します。
  6. Istio Ingress エンドポイントのレコードセットを作成します。これは、ハイブリッド ゲートウェイに API 呼び出しを実行する際のアドレスです。前の手順で取得した外部 IP を入力し、ドメイン名に接頭辞(example-endpoint など)を追加します。手順については、新しいレコードの作成をご覧ください。
    1. 一般公開マネージド ゾーンを作成します。手順については、一般公開マネージド ゾーンを作成するをご覧ください。
    2. 新しいレコードセットを作成します。
      • DNS 名: 外部 API 呼び出しが通信を行うエンドポイントの名前( api-servicesexample-endpoint など)
      • リソース レコードのタイプ: A
      • TTLTTL ユニット: デフォルトの値を使用します。
      • IP アドレス: 作成した静的 IP。
  7. [ゾーンの詳細] ビューには、新しいゾーンの NS データとして 4 つの DNS サーバーが表示されます。次の例に示すように、DNS レコードデータをコピーします。

  8. お客様の登録事業者(例: Google Domains)のドメインページに戻ります。
  9. ドメインを選択します。
  10. [DNS] を選択します。
  11. [ネームサーバー] セクションで [編集] をクリックします。
  12. ネットワーク サービスの Cloud DNS ページからコピーしたドメイン ネームサーバーを入力します。次に例を示します。

これで、Google Cloud DNS がドメインの DNS レコードを管理するようになりました。

VM に Certbot をインストールする

ドメイン サーバーを管理するように Cloud DNS が設定されたので、次に dns_google プラグインを使用して、Certbot クライアントを Cloud VM にインストールします。クライアントを使用して、Let's Encrypt エンドポイントからドメインの承認済み証明書を取得できます。

  1. Google Cloud コンソールを開き、ステップ 1: Google Cloud アカウントを作成するで作成したアカウントでログインします。
  2. ステップ 2: GCP プロジェクトを作成するで作成したプロジェクトを選択します。
  3. [IAM と管理] > [サービス アカウント] を選択します。

    [サービス アカウント] ビューに、プロジェクトのサービス アカウントのリストが表示されます。

  4. 新しいサービス アカウントを作成するには、ビューの上部にある [+サービス アカウントを作成] をクリックします。

    [サービス アカウントの詳細] ビューが表示されます。

  5. [サービス アカウント名] フィールドに、サービス アカウントの名前を入力します。

    必要に応じて [サービス アカウントの説明] フィールドに説明を追加できます。説明は、特定のサービス アカウントの用途を把握するのに役立ちます。

  6. [作成] をクリックします。

    GCP により新しいサービス アカウントが作成され、[サービス アカウント権限] ビューが表示されます。このビューを使用して、新しいサービス アカウントにロールを割り当てます。

  7. [ロールを選択] プルダウン リストをクリックします。
  8. プロジェクト オーナー ロールを選択します。
  9. [続行] をクリックします。
  10. [完了] をクリックします。
  11. GCP Console で [Compute Engine] > [VM インスタンス] を選択します。
  12. certmanager という名前の VM インスタンスを作成します。
  13. [ブートディスク] セクションで、SSD 永続ドライブ用に CentOS7 と 20 GB を選択します。
  14. サービス アカウントを上で作成したアカウントに設定します。
  15. Certbot と dns_google プラグインをマシンにインストールし、Certbot クライアントを実行します。
      sudo su -
      yum -y install yum-utils
      yum install certbot -y
      yum install certbot-dns-google -y
      certbot certonly --dns-google -d *.your_domain_name,*.your_domain_name --server https://acme-v02.api.letsencrypt.org/directory
      

    次に例を示します。

    sudo su -
    yum -y install yum-utils
    yum install certbot -y
    yum install certbot-dns-google -y
    certbot certonly --dns-google -d *.apigee-hybrid-docs.net,*.apigee-hybrid-docs.net --server https://acme-v02.api.letsencrypt.org/directory
  16. 承認済みの証明書と秘密鍵ファイルは、cd /etc/letsencrypt/live/your_domain_name/ ディレクトリにあります。

    次に例を示します。

    cd /etc/letsencrypt/live/apigee-hybrid-docs.net
    ls
      cert.pem  chain.pem  fullchain.pem  privkey.pem  README
  17. fullchain.pem ファイルと privkey.pem ファイルをローカルマシンにコピーします。
  18. 省略可: 証明書と鍵のペアを使用して Kubernetes Secret を作成します。Istio Ingress での TLS と mTLS の構成オプション 2: Kubernetes Secret の手順をご覧ください。
  19. 証明書と秘密鍵を指すようにオーバーライド ファイルを更新します。hostAliases には、以前に作成した DNS 名を使用します。

    次に例を示します。

    ...
    envs:
      - name: test
        serviceAccountPaths:
          synchronizer: "your_keypath/synchronizer-manager-service-account.json
          udca: "your_keypath/analytic-agent-service-account.json
    
    virtualhosts:
      - name: my-env-group
        sslCertPath: "$HOME/hybrid/apigee-hybrid-setup/tls/fullchain.pem"
        sslKeyPath: "$HOME/hybrid/apigee-hybrid-setup/tls/privkey.pem"
    
    mart: # Assuming you are not using Apigee Connect
      nodeSelector:
        key: cloud.google.com/gke-nodepool
        value: apigee-runtime
      sslCertPath: "$HOME/hybrid/apigee-hybrid-setup/tls/fullchain.pem"
      sslKeyPath: "$HOME/hybrid/apigee-hybrid-setup/tls/privkey.pem"
      replicaCountMin: 1
      replicaCountMax: 1

    Kubernetes Secret を使用する場合:

    ...
    envs:
      - name: test
        serviceAccountPaths:
          synchronizer: "your_keypath/synchronizer-manager-service-account.json
          udca: "your_keypath/analytic-agent-service-account.json
    
    virtualhosts:
      - name: my-env-group
        tlsMode: SIMPLE  # Note: SIMPLE is the default, MUTUAL is also an available value.
        sslSecret: myorg-test-policy-secret"
    
    mart: # Assuming you are not using Apigee Connect
      nodeSelector:
        key: cloud.google.com/gke-nodepool
        value: apigee-runtime
        sslSecret: myorg-test-policy-secret"
      replicaCountMin: 1
      replicaCountMax: 1
    
    ...  
  20. 変更を適用します。

    mart 構成を変更した場合は、その変更を適用します。

    apigeectl apply -f your_overrides_file --all-envs

    envs 構成を変更した場合は、その変更を適用します。

    apigeectl apply -f your_overrides_file --all-envs
  21. 構成のテスト

    新しい API プロキシを作成してデプロイするの説明に従って、プロキシをデプロイしてテストします。