はじめに
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