Plugging in CA certificate and key

这个task展示运维如何把现有的证书和密钥插入到Istio CA中。

默认情况下,Istio CA生成自签名CA证书和密钥,并使用它们签署工作负载证书。Istio CA也可以使用运维指定证书和私钥签署工作负载证书。这个task演示了一个插入证书和密钥到Istio CA中的例子。

Before you begin

  • 安装Istio。注意在 installation steps 中的第5步开启身份认证。

Plugging in the existing certificate and key

假设我们想要Istio CA使用已有的证书ca-cert.pem 和密钥 ca-key.pem。此外,证书 ca-cert.pem 是由根证书root-cert.pem 签署的,我们希望使用 root-cert.pem 作为Istio 工作负载的根证书。

在这个例子中,因为Istio CA证书 (ca-cert.pem)没有设置为工作负载根证书(root-cert.pem),工作负载不能直接从根证书确认工作负载的证书。工作负载需要一个 cert-chain.pem 文件指定信任链,它应该包括工作负载和根CA间的所有中间CAs的证书。在这个例子中,它只包含CA证书,因此 cert-chain.pemca-cert.pem 相同。注意如果你的 ca-cert.pemroot-cert.pem相同,你可以使用空的 cert-chain.pem 文件。

下载示例文件:

rm /tmp/ca-cert.pem /tmp/ca-key.pem /tmp/root-cert.pem /tmp/cert-chain.pem
wget -P /tmp https://raw.githubusercontent.com/istio/istio/master/security/samples/plugin_ca_certs/ca-cert.pem
wget -P /tmp https://raw.githubusercontent.com/istio/istio/master/security/samples/plugin_ca_certs/ca-key.pem
wget -P /tmp https://raw.githubusercontent.com/istio/istio/master/security/samples/plugin_ca_certs/root-cert.pem
wget -P /tmp https://raw.githubusercontent.com/istio/istio/master/security/samples/plugin_ca_certs/cert-chain.pem

下面步骤能够在Istio CA中插入证书和密钥:

1.创建一个密码 cacert ,它包括所有输入文件 ca-cert.pem, ca-key.pem, root-cert.pem and cert-chain.pem:

kubectl create secret generic cacerts -n istio-system --from-file=/tmp/ca-cert.pem --from-file=/tmp/ca-key.pem \
--from-file=/tmp/root-cert.pem --from-file=/tmp/cert-chain.pem

2.重新部署Istio CA,它从密码安装文件读取证书和密钥:

kubectl apply -f install/kubernetes/istio-ca-plugin-certs.yaml

3.确认工作负载立即获取新的证书,删除Istio CA(named as istio.*)生成的密码。在这个例子中是 istio.default。Istio CA将会为工作负载颁发新证书

kubectl delete secret istio.default

注意,如果你使用不同的证书/密钥文件或者密码名,你需要改变 istio-ca-plugin-certs.yaml 文件中的对应参数。

Verifying the new certificates

这小节中,我们核实被传播的新的工作负载证书和根证书。这需要你在机器上安装 openssl

1.部署bookinfo
2.检索挂载的证书
获取pods:

kubectl get pods

打印:

NAME                                        READY     STATUS    RESTARTS   AGE
details-v1-1520924117-48z17                 2/2       Running   0          6m
productpage-v1-560495357-jk1lz              2/2       Running   0          6m
ratings-v1-734492171-rnr5l                  2/2       Running   0          6m
reviews-v1-874083890-f0qf0                  2/2       Running   0          6m
reviews-v2-1343845940-b34q5                 2/2       Running   0          6m
reviews-v3-1813607990-8ch52                 2/2       Running   0          6m

接下来,我们以pod ratings-v1-734492171-rnr5l 为例,并核实其挂载的证书。运行如下命令检索在proxy上挂载的证书:

kubectl exec -it ratings-v1-734492171-rnr5l -c istio-proxy -- /bin/cat /etc/certs/root-cert.pem > /tmp/pod-root-cert.pem

文件 /tmp/pod-root-cert.pem 应该由运维在根证书中指定。

kubectl exec -it ratings-v1-734492171-rnr5l -c istio-proxy -- /bin/cat /etc/certs/cert-chain.pem > /tmp/pod-cert-chain.pem

文件/tmp/pod-cert-chain.pem 中应该包含工作负载证书及CA证书。

3.核实根证书是否和运维指定的相同:

openssl x509 -in /tmp/root-cert.pem -text -noout > /tmp/root-cert.crt.txt
openssl x509 -in /tmp/pod-root-cert.pem -text -noout > /tmp/pod-root-cert.crt.txt
diff /tmp/root-cert.crt.txt /tmp/pod-root-cert.crt.txt

4.核实CA证书是否和运维指定的相同:

tail /tmp/pod-cert-chain.pem -n 22 > /tmp/pod-cert-chain-ca.pem
openssl x509 -in /tmp/ca-cert.pem -text -noout > /tmp/ca-cert.crt.txt
openssl x509 -in /tmp/pod-cert-chain-ca.pem -text -noout > /tmp/pod-cert-chain-ca.crt.txt
diff /tmp/ca-cert.crt.txt /tmp/pod-cert-chain-ca.crt.txt

预期输出结果为空。

5.从根证书到工作负载证书核实证书链:

head /tmp/pod-cert-chain.pem -n 18 > /tmp/pod-cert-chain-workload.pem
openssl verify -CAfile <(cat /tmp/ca-cert.pem /tmp/root-cert.pem) /tmp/pod-cert-chain-workload.pem

预期结果:

/tmp/pod-cert-chain-workload.pem: OK

Cleanup

  • 移除密码 cacerts:
kubectl delete secret cacerts -n istio-system
  • 移除Istio组件:
kubectl delete -f install/kubernetes/istio-auth.yaml

猜你喜欢

转载自blog.csdn.net/ybt_c_index/article/details/80360592
CA