Citrix ADC ingress controller

Citrix ingress controller での TLS 証明書の処理

Citrix ingress controller には、Citrix ADC SSLベースの仮想サーバーのTLS証明書を構成するオプションがあります。SSL 仮想サーバは、SSL トラフィックをインターセプトし、復号化して処理してから、仮想サーバにバインドされたサービスに送信します。

デフォルトでは、SSL 仮想サーバは 1 つのデフォルト証明書にバインドでき、アプリケーションは証明書にバインドされたポリシーに基づいてトラフィックを受信します。ただし、複数の証明書を 1 つの仮想サーバーにバインドするサーバー名表示 (SNI) オプションもあります。Citrix ADCは、TLSハンドシェイクのドメイン名に基づいて、クライアントに提示する証明書を決定します。

Citrix ingress controller は、次の3つの方法で証明書を処理します。

前提要件

Citrix ingress controller を使用してTLS証明書を処理するには、 Citrix ADCでアプリケーションのTLSサポートを有効にする必要があります 。また、Kubernetes展開で証明書を使用している場合は、 証明書を使用してKubernetesシークレットを生成する必要があります

Citrix ADCでアプリケーションのTLSサポートを有効にする

Citrix Ingress Controller erは、Citrix ADCでTLSをサポートするためのイネーブラーとして、イングレス定義のTLSセクションを使用します。

注:

デフォルト証明書または構成済み証明書の場合、TLS を有効にするには、イングレス定義の spec.tls.secretname フィールドに空のシークレットを追加する必要があります。

イングレス定義のサンプルスニペットは次のとおりです。

spec:
  tls:
  - secretName:
<!--NeedCopy-->

Kubernetes シークレットを生成する

既存の証明書の Kubernetes シークレットを生成するには、以下のkubectlコマンドを使用します。

     kubectl create secret tls k8s-secret --cert=path/to/tls.cert --key=path/to/tls.key  --namespace=default

    secret “k8s-secret” created

このコマンドは、tls.crtキーの下に PEM 形式の証明書と、 tls.keyキーの下に PEM 形式のプライベートキーを持つ Kubernetes シークレットを作成します。

また、次の YAML 定義を使用して Kubernetes シークレットを生成することもできます。

apiVersion: v1
kind: Secret
metadata:
  name: k8s-secret
data:
  tls.crt: base64 encoded cert
  tls.key: base64 encoded key
<!--NeedCopy-->

kubectl -create <file-name> コマンドを使用して YAML をデプロイします。これにより、キーの下に PEM 形式の証明書があり、 tls.crt キーの下に PEM 形式のプライベートキーがある Kubernetes シークレットが作成されます。 tls.key

Citrix ingress controller デフォルト証明書

Citrix ingress controller erのデフォルト証明書は、Kubernetesで非SNI証明書として使用する必要のあるシークレットを提供するために使用されます。Citrix ingress controller の.yamlファイルには、使用するシークレット名と引数として使用する名前空間を指定する必要があります。

    --default-ssl-certificate <NAMESPACE>/<SECRET_NAME>

以下は、 ssl 名前空間から取得され、Citrix ingress controller デフォルト証明書として提供された TLS シークレット (hotdrink.secret) を含む Citrix ingress controller の YAML 定義ファイルの例です。

注:

名前空間は、有効な SECRET_NAME と共に必須です。

apiVersion: v1
kind: Pod
metadata:
  name: cic
  labels:
    app: cic
spec:
  serviceAccountName: cpx
  containers:
  - name: cic
    image: "xxxx"
    imagePullPolicy: Always
    args:
    - --default-ssl-certificate
      ssl/hotdrink.secret
    env:
    # Set Citrix ADM Management IP
    - name: "NS_IP"
      value: "xx.xx.xx.xx"
    # Set port for Nitro
    - name: "NS_PORT"
      value: "xx"
    # Set Protocol for Nitro
    - name: "NS_PROTOCOL"
      value: "HTTP"
    # Set username for Nitro
    - name: "NS_USER"
      value: "nsroot"
    # Set user password for Nitro
    - name: "NS_PASSWORD"
      value: "nsroot"
<!--NeedCopy-->

事前構成済み証明書

Citrix ingress controller では、Citrix ADCですでに構成されている証明書キーを使用できます。Ingress 定義で以下のアノテーションを使用して、証明書に関する詳細を指定する必要があります。

    ingress.citrix.com/preconfigured-certkey : '{"certs": [ {"name": "<name>", "type": "default|sni|ca"} ] }'

複数の証明書に関する詳細をアノテーション内のリストとして指定できます。また、証明書の扱い方も定義できます。次のアノテーション例では、certkey1 を非 SNI 証明書として使用し、certkey2 を SNI 証明書として使用しています。

    ingress.citrix.com/preconfigured-certkey : '{"certs": [ {"name": "certkey1", "type": "default"}, {"name": "certkey2", "type": "sni"} ] }’

type パラメーターに証明書の名前を指定しない場合、そのパラメーターはデフォルト (非 SNI) タイプと見なされます。

注:

Citrix ADCに存在する証明書を再利用し、Citrix ingress controller によって管理されるアプリケーションにバインドする場合は、この機能を必ず使用してください。Citrix ingress controller は証明書のライフサイクルを管理しません。つまり、証明書の作成や削除は行わず、必要なアプリケーションにバインドされるだけです。

入力 YAML の TLS セクション

Kubernetes では、 イングレス定義のspec:セクションに TLS シークレットを指定することができます。このセクションでは、Citrix ingress controller がこれらのシークレットを使用する方法について説明します。

ホストセクションで

ホストセクションにシークレット名が指定されている場合、Citrix ingress controller はシークレットをSNI証明書としてバインドします。

spec:
  tls:
  - secretName: fruitjuice.secret
    hosts:
    - items.fruit.juice
<!--NeedCopy-->

ホストセクションなし

ホストセクションなしでシークレット名を指定すると、Citrix ingress controller はシークレットをデフォルトの証明書としてバインドします。

spec:
  tls:
  - secretName: colddrink.secret
<!--NeedCopy-->

注:

複数のシークレットが指定されている場合、Citrix ingress controller はすべての証明書をSNI対応証明書としてバインドします。

注意事項

  1. Citrix ingress controller に複数のシークレットが提供される場合、次の優先順位に従います。

    1. 事前設定されたデフォルト certkey または非ホスト TLS シークレット
    2. デフォルト SSL 証明書
  2. 同じグレードの証明書間で優先順位が競合する場合(たとえば、2つのIngressファイルがそれぞれデフォルト/非SNIタイプとして非ホストTLSシークレットを構成する場合)、Citrix Ingress ControllerはCitrix ingress controller Citrix ingress controller erのデフォルト証明書を非SNI証明書としてバインドし、その他すべての証明書を使用しますSNI を使用した証明書。

  3. TLS セクションで指定されたシークレットに使用される証明書には、CN 名が必要です。それ以外の場合は、Citrix ADC にバインドされません。

  4. SSL 仮想サーバで SNI が有効になっている場合は、次のようになります。

    • 非 SNI (デフォルト) 証明書は、次の HTTPS 要求に使用されます。

       curl -1 -v -k https://1.1.1.1/
      
       curl -1 -v -k -H 'HOST:*.colddrink.beverages' https://1.1.1.1/
      
    • SNI 対応証明書は、フルドメイン名のリクエストに使用されます。

       curl -1 -v -k https://items.colddrink.beverages/
      

      証明書と一致しない要求が受信されると、CN 名は失敗します。

Citrix ingress controller での TLS 証明書の処理