GNU/Linux >> Linux の 問題 >  >> Ubuntu

Kubernetesの自己署名証明書を生成する方法

はじめに

2020年に、GoogleChromeはSameSite=Noneの動作を変更しました Secureのアクティブ化を要求するCookie オプション。その結果、APIバックエンドがローカルKubernetesクラスターで実行されているWeb UIクライアントをテストするには、HTTPSアクセスが必要になります。

このチュートリアルでは、cert-manager、CFSSL、Easy-RSA、およびOpenSSLメソッドを使用してKubernetesの自己署名証明書を生成することでHTTPSアクセスを取得する方法を学習します。

前提条件

  • Kubernetesクラスター(minikubeを使用して作成できます)
  • kubectlコマンドラインツールがインストールされています

cert-managerを介した証明書の生成

ネイティブのKubernetes証明書管理コントローラーとして、 cert-manager アドオンは、自己署名証明書を生成するための最も一般的な方法です。

ステップ1:cert-managerをインストールする

cert-managerをインストールするには、最初にその名前空間を作成します:

kubectl create namespace cert-manager

次に、 kubectl applyを使用します コマンドとyaml アドオンをインストールするためにオンラインで利用できるファイル:

kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.13.1/cert-manager.yaml

ステップ2:証明書発行者を作成する

名前空間を作成する 証明書を生成する場所:

kubectl create namespace [namespace]

次に、証明書発行者を定義します ターミナルに次の複数行のコマンドを入力します。

kubectl apply -n [namespace] -f <(echo "
apiVersion: cert-manager.io/v1alpha2
kind: Issuer
metadata:
  name: [issuer-name]
spec:
  selfSigned: {}
")

出力は、発行者の作成が成功したことを確認します:

この方法で作成された発行者は、現在のネームスペースに対してのみ機能します。クラスタ内の任意の名前空間から証明書をリクエストできるようにする場合は、 ClusterIssuerというカスタムKubernetesリソースを作成します 利用可能なselfsigned-issuer.yamlを使用する ファイル:

kubectl apply -f https://gist.githubusercontent.com/t83714/51440e2ed212991655959f45d8d037cc/raw/7b16949f95e2dd61e522e247749d77bc697fd63c/selfsigned-issuer.yaml

ステップ3:証明書を生成する

ターミナルに次の複数行のコマンドを入力して、自己署名証明書を生成します。

kubectl apply -n [namespace]-f <(echo '
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
  name: [certificate-name]
spec:
  secretName: [secret-name]
  dnsNames:
  - "*.[namespace].svc.cluster.local"
  - "*.[namespace]"
  issuerRef:
    name: [issuer-name]
')

出力は、作成が成功したことを確認します:

作成した証明書を確認するには、次のように入力します。

kubectl -n [namespace] get certificate

シークレットに関する情報を表示するには、 get secretを使用します コマンド:

kubectl -n [namespace] get secret [secret-name]

このシークレットに含まれる3つのキーは、 ca.crtです。 tls.crt 、および tls.key 。シークレット全体について、次のように入力します。

kubectl -n [namespace] get secret [secret-name] -o yaml

ステップ4:証明書をテストする

次のコマンドを使用して、証明書の有効性をテストします。

openssl x509 -in <(kubectl -n [namespace] get secret \
  first-tls -o jsonpath='{.data.tls\.crt}' | base64 -d) \
  -text -noout

X509v3 Subject Alternative Name 行にはdnsNamesが含まれている必要があります 証明書の生成中に提供しました。

CFSSLを介した証明書の生成

自己署名証明書を生成および検証するためのもう1つの一般的なツールは、 CFSSLです。 。このツールは4つのプログラムで構成されています:

  • cfssl –CFSSLパッケージ管理用のコマンドラインユーティリティ。
  • multirootca –認証局サーバー。
  • mkbundle –証明書プールバンドルビルダー。
  • cfssljson jsonを使用する証明書ジェネレーター cfsslからの出力 およびmultirootca

以下の手順は、CFSSLを使用して自己署名証明書を生成する方法を示しています。

ステップ1:Goを使用してCFSSLをインストールする

CFSSLをインストールするには、まず、必要なGo言語パッケージをインストールする必要があります。次のコマンドを入力します:

sudo apt install golang

次に、Go構文を使用して cfsslをダウンロードします。

go get -u github.com/cloudflare/cfssl/cmd/cfssl

次に、 ~/go/binからファイルをコピーします 適切なフォルダに移動します:

sudo cp ~/go/bin/cfssl /usr/local/bin/cfssl

最後に、 cfssljsonを使用してプロセスを繰り返します

go get -u github.com/cloudflare/cfssl/cmd/cfssljson
sudo cp ~/go/bin/cfssljson /usr/local/bin/cfssljson

ステップ2:認証局を作成する

プログラムをインストールしたら、自己署名認証局(CA)の作成に進みます。以下の例では、 ca.jsonという名前のファイルを作成します

このファイルは以下を定義します:

  • CN –機関の一般名
  • algo –証明書に使用されるアルゴリズム
  • size –ビット単位のアルゴリズムサイズ
  • C –国
  • L –地域(都市)
  • ST –州または州
  • O –組織
  • OU –組織単位

以下の例は、米国ニューヨーク州ニューヨークに拠点を置く「ExampleCompany」という組織とその組織単位「ExampleCompanyRootCA」の例です。

{
  "CN": "Example Company Root CA",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
  {
    "C": "US",
    "L": "New York",
    "ST": "New York",
    "O": "Example Company",
    "OU": "Example Company Root CA"
  }
 ]
}

jsonを作成して保存します テキストエディタでファイル。次に、それを使用して ca.pemを生成します およびca-key.pem 次のcfsslを入力してファイルを入力します コマンド:

cfssl gencert -initca ca.json | cfssljson -bare ca

ステップ3:構成ファイルを作成する

続行するには、 cfssl.jsonを作成します 構成ファイル。このファイルには、証明書の有効期限と個別のプロファイル(ピア、サーバー、クライアント)の使用法に関する詳細が記載されています。

cfssl.json 次のようになります:

{
  "signing": {
    "default": {
      "expiry": "8760h"
    },
    "profiles": {
      "intermediate_ca": {
        "usages": [
            "signing",
            "digital signature",
            "key encipherment",
            "cert sign",
            "crl sign",
            "server auth",
            "client auth"
        ],
        "expiry": "8760h",
        "ca_constraint": {
            "is_ca": true,
            "max_path_len": 0, 
            "max_path_len_zero": true
        }
      },
      "peer": {
        "usages": [
            "signing",
            "digital signature",
            "key encipherment", 
            "client auth",
            "server auth"
        ],
        "expiry": "8760h"
      },
      "server": {
        "usages": [
          "signing",
          "digital signing",
          "key encipherment",
          "server auth"
        ],
        "expiry": "8760h"
      },
      "client": {
        "usages": [
          "signing",
          "digital signature",
          "key encipherment", 
          "client auth"
        ],
        "expiry": "8760h"
      }
    }
  }
}

保存 ファイルを終了します。

ステップ4:中間認証局を作成する

別のjson 作成する必要のあるファイルはintermediate-ca.json 。これは中間認証局を定義し、以前に作成された ca.jsonに似ています。

{
  "CN": " Example Company Intermediate CA",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "US",
      "L": "New York",
      "ST": "New York",
      "O": "Example Company",
      "OU": "Example Company Intermediate CA"
    }
  ],
  "ca": {
    "expiry": "42720h"
  }
}

ステップ5:証明書に署名する

両方のファイルを作成したら、次のコマンドを入力して intermediate_ca.pemを作成します intermediate_ca.csr およびintermediate_ca-key.pem ファイルを作成し、中間CAに署名します:

cfssl gencert -initca intermediate-ca.json | cfssljson -bare intermediate_ca

次に、CAとcfssl.json構成ファイルを使用して証明書に署名します。

cfssl sign -ca ca.pem -ca-key ca-key.pem -config cfssl.json -profile intermediate_ca intermediate_ca.csr | cfssljson -bare intermediate_ca

ステップ6:ホスト証明書を生成する

ピア、サーバー、およびクライアントプロファイルのホスト証明書を生成するには、 host1.jsonを作成します ホストに関する必要な情報をファイルに入れます。

{
  "CN": "host.example-company.com",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "US",
      "L": "New York",
      "O": "Example Company",
      "OU": "Example Company Intermediate CA",
      "ST": "New York"
    }

  ],
  "hosts": [
    "host1.example-company.com",
    "localhost"
  ]
}

次に、作成した構成ファイルを使用して証明書を生成します。サーバー間の通信を可能にするピア証明書の場合は、次のように入力します。

cfssl gencert -ca intermediate_ca.pem -ca-key intermediate_ca-key.pem -config cfssl.json -profile=peer host1.json | cfssljson -bare host-1-peer

サーバー証明書を生成するには、次のように入力します。

cfssl gencert -ca intermediate_ca.pem -ca-key intermediate_ca-key.pem -config cfssl.json -profile=server host1.json | cfssljson -bare host-1-server

クライアント証明書の構文は、多くの場合は必要ありませんが、一部のシステムでサポートされています。

cfssl gencert -ca intermediate_ca.pem -ca-key intermediate_ca-key.pem -config cfssl.json -profile=client host1.json | cfssljson -bare host-1-client

それぞれの出力は、証明書が正常に生成されたことを確認します。

Easy-RSAによる証明書の生成

簡単-RSA は、ルート認証局を作成し、証明書を要求して署名するための一般的なユーティリティです。

ステップ1:Easy-RSAをインストールする

Easy-RSAパッケージをダウンロードするには、curlが必要です。 curlをインストールしていない場合は、次のように入力してインストールします。

sudo apt install curl

ここで、次のcurlコマンドを入力します。

Curl -LO https://storage.googleapis.com/kubernetes-release/easy-rsa/easy-rsa.tar.gz

ダウンロードしたアーカイブを解凍します:

tar xzf easy-rsa.tar.gz

easy-rsa-3.0.1/easyrsa3に移動します ディレクトリ:

cd easy-rsa-master/easyrsa3

フォルダに移動したら、次のコマンドを入力してEasy-RSAの設定を完了します。

./easyrsa init-pki

ステップ2:自己署名CAを作成する

自己署名CAの作成を開始するには、次のコマンドを使用します。

./easyrsa build-ca

ca.keyを暗号化するためのPEMパスフレーズを入力するように求められます ファイル。次に、プロンプトで、作成しているCAに関する情報を入力する必要があります。

ステップ3:サーバー証明書とキーを生成する

次のステップは、以下に示す複数行のコマンドを使用してサーバー証明書とキーを生成することです。 --subject-alt-name オプションは、APIサーバーにアクセスするためのIPアドレスとDNS名を設定します。

--days オプションは、証明書の有効期間の長さを制御します。

cluster.local はデフォルトのDNSドメイン名です。

./easyrsa --subject-alt-name="IP:[master-IP-address]," \
"IP:[master-cluster-IP-address]," \
"DNS:kubernetes," \
"DNS:kubernetes.default," \
"DNS:kubernetes.default.svc," \
"DNS:kubernetes.default.svc.cluster," \
"DNS:kubernetes.default.svc.cluster.local" \ 
--days=10000 \
build-server-full server nopass

前の手順で作成したパスフレーズを繰り返すように求められます。次に、出力はデータベースが新しいエントリで更新されたことを確認します。 pki/ca.crtをコピーします pki/issued/server.crt およびpki/private/server.key ディレクトリにファイルを追加します。

OpenSSLを介した証明書の生成

OpenSSLを使用すると、TLS証明書を手動で生成できます。次の手順は、OpenSSLを使用してクラスターのキーと証明書を生成する方法を示しています。

ステップ1:OpenSSLをインストールする

OpenSSL ツールは通常、Linuxシステムにプリインストールされています。次のように入力して、インストールされているかどうかを確認します。

openssl version -a

出力は次のようになります:

システムにOpenSSLがないというメッセージが表示された場合は、ディストリビューションのパッケージマネージャーを使用してツールをインストールしてください。

例:

sudo apt install openssl

ステップ2:証明書ファイルを生成する

次のコマンドを使用して、証明書署名用の2048ビットのRSA暗号化キーを生成します。

openssl genrsa -out ca.key 2048

ここで、 ca.keyを使用します ca.crtを生成します -daysを使用する 証明書の有効期間を設定するオプション:

openssl req -x509 -new -nodes -key ca.key -subj "/CN=[master-ip-address]" -days [number] -out ca.crt

エラーが発生しなかった場合、コマンドは出力を生成しません。

最後に、 server.keyを生成します 2048ビットのRSA暗号化を使用したファイル:

openssl genrsa -out server.key 2048

ステップ3:証明書構成ファイルを作成する

csr.confを作成します 証明書署名要求(CSR)を生成するための構成ファイル。以下のサンプルファイルは、 cluster.localを使用していることも前提としています。 デフォルトのDNSドメイン名として。

[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
C = [country]
ST = [state]
L = [city]
O = [company]
OU = [organization-unit]
CN = [common-name]

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster
DNS.5 = kubernetes.default.svc.cluster.local
IP.1 = [MASTER_IP]
IP.2 = [MASTER_CLUSTER_IP]

[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth
[email protected]_names

角かっこ内の説明を実際の値に置き換えてください。ファイルを保存し、それを使用して証明書署名要求を生成します:

openssl req -new -key server.key -out server.csr -config csr.conf

このコマンドは出力を生成しませんが、 server.csrを作成します ファイル。

ステップ4:証明書を生成する

前の手順で生成したファイルをca.keyと一緒に使用します およびca.crt サーバー証明書を作成するには:

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out server.crt -days 10000 \
-extensions v3_ext -extfile csr.conf

この複数行コマンドの出力は、証明書の作成を確認し、構成ファイルからのデータを一覧表示します。

作成した証明書を表示するには、次のように入力します。

openssl x509 -noout -text -in ./server.crt

Ubuntu
  1. cPanelに自己署名SSL証明書をインストールする方法

  2. OpenSSLを使用してx509SHA256ハッシュ自己署名証明書を生成する方法

  3. SSL証明書のcPanelでキーとCSRを生成する方法

  1. Kubernetes構成にConfigMapを使用する方法

  2. SSLの証明書署名要求(CSR)を生成する方法

  3. Ubuntu18.04で自己署名SSL証明書を作成する方法

  1. CentOS7用のApacheにSSL証明書をインストールする方法

  2. ローリングアップデート用にKubernetesを設定する方法

  3. KubernetesでNGINXIngressControllerをセットアップする方法